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();