日期:2014-05-20  浏览次数:20685 次

100分请教多线程的问题,测试通过马上结帖
我有个表里面储藏了

很多FLASH的URL

比如有10万条记录

现在我想开10个线程,每个线程下载一个FLASH

如果其中有个线程完成任务了,那么程序马上就在开一个线程

这样保证最多有10个线程在下载数据

该怎么做啊,知道的朋友请教教我



------解决方案--------------------
把例子给你贴出来:

使用回调方法检索数据
下面的示例演示了一个从线程中检索数据的回调方法。包含数据和线程方法的类的构造函数也接受代表回调方法的委托;在线程方法结束前,它调用该回调委托。

using System;
using System.Threading;

// The ThreadWithState class contains the information needed for
// a task, the method that executes the task, and a delegate
// to call when the task is complete.
//
public class ThreadWithState {
// State information used in the task.
private string boilerplate;
private int value;

// Delegate used to execute the callback method when the
// task is complete.
private ExampleCallback callback;

// The constructor obtains the state information and the
// callback delegate.
public ThreadWithState(string text, int number,
ExampleCallback callbackDelegate)
{
boilerplate = text;
value = number;
callback = callbackDelegate;
}

// The thread procedure performs the task, such as
// formatting and printing a document, and then invokes
// the callback delegate with the number of lines printed.
public void ThreadProc()
{
Console.WriteLine(boilerplate, value);
if (callback != null)
callback(1);
}
}

// Delegate that defines the signature for the callback method.
//
public delegate void ExampleCallback(int lineCount);

// Entry point for the example.
//
public class Example
{
public static void Main()
{
// Supply the state information required by the task.
ThreadWithState tws = new ThreadWithState(
"This report displays the number {0}. ",
42,
new ExampleCallback(ResultCallback)
);

Thread t = new Thread(new ThreadStart(tws.ThreadProc));
t.Start();
Console.WriteLine( "Main thread does some work, then waits. ");
t.Join();
Console.WriteLine(
"Independent task has completed; main thread ends. ");
}

// The callback method must match the signature of the
// callback delegate.
//
public static void ResultCallback(int lineCount)
{
Console.WriteLine(
"Independent task printed {0} lines. ", lineCount);
}
}
------解决方案--------------------
1.有一个父线程,控制子线程的创建、并控制并发数量。
2.子线程中有一个完成事件,当下载完成一个FLASH的时候触发它。
3.父线程捕获子线程的完成事件,将当前并发数量减少。
------解决方案--------------------
你所要做的就是在这里:

public void ThreadProc()
{
Console.WriteLine(boilerplate, value);
if (callback != null)
callback(1);
}

-> >

public void ThreadProc()
{
//进行下载
//下载完成,CallBack,当然要判断此时表中存储的URL是否都已经用完,如果没有了,那也不用再CallBack了..

}

你的CallBack函数,即回调函数中就是启动一个纯程的操作...

------解决方案--------------------
写了个小例子,不知道能不能说明问题..

//互斥量
static Mutex mx = new Mutex();
//用于存储资源
static ArrayList list = new ArrayList();