[英]Understanding catching exceptions and doing continuations in multi-threaded code
我正在检查我正在做的工作,并认为我会对此有更多的关注。 我在生产中使用的代码给我们带来了麻烦。 它使用多线程,而我在该领域还比较陌生。 我接受了我认为一直很麻烦的代码,并试图将其隔离到其核心,并且一直在摆弄我的“模型”。 这是我想出的。 我希望任何人都想分享的任何反馈意见。 提前致谢。
static void Main(string[] args)
{
var semaphoreSlim = new SemaphoreSlim(3);
Console.WriteLine("Starting loop");
var foo = new[] {1, 2, 3, 4, 5, 6};
foreach (var i in foo)
{
Console.WriteLine("Queueing task {0}", i);
var j = i;
var sl = i*1000;
var task = Task.Factory.StartNew(() =>
{
semaphoreSlim.Wait();
try
{
Console.WriteLine("Task {0} started - sleep {1} ms", j, sl);
Thread.Sleep(sl);
if (j == 2 || j == 5) throw new Exception("error");
Console.WriteLine("Task {0} done", j);
}
catch (Exception)
{
Console.WriteLine("Caught exception {0}", j);
throw;
}
finally
{
semaphoreSlim.Release();
}
});
task.ContinueWith(x => Console.WriteLine("Continuation: Completed {0}", j),
TaskContinuationOptions.OnlyOnRanToCompletion);
task.ContinueWith(x => Console.WriteLine("Continuation: Faulted {0}", j),
TaskContinuationOptions.OnlyOnFaulted);
}
Console.WriteLine("Finished loop");
Console.ReadLine();
}
如何显示“流程似乎跳过了某些成员”问题?
如果在输出中看到“ Finished loop”,则认为过程已完成,原因是您的任务可能尚未完成。
等待创建的任务完成,然后再编写“完成的循环”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.