Zen*_*ker 5 .net c# multithreading task-parallel-library
昨天在SO上,我看到一个线程要求代码,其中一些是这样做的.我的意思是,您(经理线程)使用TPL API启动任务数量,一旦完成作业,该线程应通知您(经理)回复谁维护任务池.
所以这是我试过的代码.虽然我必须说它的工作原理如上所述.
class TaskJob
{
public delegate void NotificationDelegate(int? taskId,string message);
public event NotificationDelegate NotifyCompletion;
public void TaskToRun()
{
try
{
if (Task.CurrentId == 4)//If its a 4th thread, simulate exception
throw new Exception();
Console.WriteLine("Task started with thread id " + Task.CurrentId);
Thread.Sleep(100000);
Console.WriteLine("Task finished with thread id " + Task.CurrentId);
NotifyCompletion(Task.CurrentId, "Successfully completed");
}
catch
{
NotifyCompletion(Task.CurrentId, "Faulted error");
}
}
}
class Program
{
static List<Task> taskList = new List<Task>();
public static void Main()
{
for (int i = 0; i < 5; i++)//starting 5 threads/tasks
{
TaskJob tb = new TaskJob();
tb.NotifyCompletion += new ConsoleApplication1.TaskJob.NotificationDelegate(tb_NotifyCompletion);
Task t = Task.Factory.StartNew(tb.TaskToRun);
taskList.Add(t);
}
Task.WaitAll(taskList.ToArray());
CheckAndDispose();
Console.ReadLine();
}
private static void CheckAndDispose()
{
foreach (var item in taskList)
{
Console.WriteLine("Status of task = " + item.Id + " is = " + item.Status);
item.Dispose();
}
}
static void tb_NotifyCompletion(int? taskId, string message)
{
Console.WriteLine("Task with id completed ="+ taskId + " with message = " + message);
}
}
Run Code Online (Sandbox Code Playgroud)
几个抬头:
现在我问自己几个问题,但没有说服自己一个合适的答案.他们是:
非常感谢 :)
Jon*_*eet 22
完全没有必要自己这样做 - 使用Task.ContinueWith或继续使用Task<T>.ContinueWith.这基本上可以让你说出任务完成时要做什么 - 包括在失败,取消和成功时执行不同的代码.
它还会返回一个任务,因此您可以在完成任务后继续执行.
哦,你可以给它一个TaskScheduler,所以从UI线程你可以说,"当这个后台任务完成时,在UI线程上执行给定的委托"或类似的东西.
这是构建C#5异步方法的方法.
| 归档时间: |
|
| 查看次数: |
24010 次 |
| 最近记录: |