【发布时间】:2018-05-24 08:20:45
【问题描述】:
我有以下情况:
foreach(var item in collection)
{
DoWork().Wait;
}
如您所见,有一个迭代集合的 foreach,对于每个调用,我需要等待 DoWork 完成执行,然后 foreach 可以继续。
问题是在DoWork 内部我正在使用Parallel 并且我得到一个“冻结”程序的异常,特别是没有显示任何异常,这是我的实现:
public async Task DoWork()
{
Try
{
Parallel.Invoke(
() => Foo(),
() => Foo2(),
() => Foo3());
}
catch(Exception e)
{
//No exception caught
}
}
我在Foo方法里面加了一个Console.WriteLine比如:
public void Foo()
{
Console.WriteLine("foo 1");
}
在Foo2 方法内部生成了一个异常,但我看不到是哪个异常,因为我在catch 上设置了一个断点,而这并没有触发。
我做错了什么?
【问题讨论】:
-
这不是问题所在,而是您的
DoWork()方法不会异步运行。无论如何,当我尝试您的代码的可编译版本时,我会看到异常。你能发布一个可编译的复制品吗? -
我想你的问题实际上是
DoWork().Wait,你对异步代码的阻塞。不要这样做。把它放在一个线程上或一路异步 -
@ClayVerValen 因为正如我在问题中所写,我添加了 Console.WriteLine 以了解哪个方法被调用以及哪个失败,第三种方法没有被调用,因此前两种方法之一会产生异常
-
未调用 Foo3 的事实并不意味着正在生成异常。这只意味着它没有被调用。如果您的程序冻结,我怀疑 Foo1 正在做一些由于 Foo2 正在做的事情而无法继续执行的操作,反之亦然。如果您的程序在调用 Foo3 之前退出,那么可能存在异常,但您只提到了冻结。
标签: c# multithreading