C# 如何并行管理异常。调用?
我有以下情况:C# 如何并行管理异常。调用?,c#,multithreading,C#,Multithreading,我有以下情况: foreach(var item in collection) { DoWork().Wait; } 正如您所看到的,有一个foreach在集合上迭代,对于每个调用,我需要等待DoWork完成执行,然后foreach可以继续 问题在于,在DoWork内部,我使用的是Parallel,我得到一个异常,即“冻结”程序,特别是没有显示任何异常,这是我的实现: public async Task DoWork() { Try { Parallel
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
方法中添加了控制台。WriteLine
例如:
public void Foo()
{
Console.WriteLine("foo 1");
}
在方法Foo2
中生成了一个异常,但我看不出是哪个异常,因为我在catch
上设置了一个断点,而这不会触发
我做错了什么
DoWork()
方法没有异步运行,因为它缺少任何调用
等待DoWork()
正确异步,则需要使用Task.Run()
和wait Task.WhenAll()
,如下所示:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Demo
{
class Program
{
public static async Task Main()
{
Console.WriteLine("Awaiting DoWork()");
await DoWork();
Console.WriteLine("Finished awaiting. Press <RETURN> to exit.");
Console.ReadLine();
}
public static async Task DoWork()
{
try
{
await Task.WhenAll(
Task.Run(() => Foo()),
Task.Run(() => Foo2()),
Task.Run(() => Foo3())
);
}
catch (Exception e)
{
Console.WriteLine("Caught exception: " + e.Message);
}
}
public static void Foo()
{
Console.WriteLine("Starting Foo()");
Thread.Sleep(1000);
Console.WriteLine("Finishing Foo()");
}
public static void Foo2()
{
Console.WriteLine("Starting Foo2()");
Thread.Sleep(500);
Console.WriteLine("Foo2() is throwing an exception.");
throw new InvalidOperationException("OOPS!");
}
public static void Foo3()
{
Console.WriteLine("Starting Foo3()");
Thread.Sleep(250);
Console.WriteLine("Finishing Foo3()");
}
}
}
使用系统;
使用系统线程;
使用System.Threading.Tasks;
名称空间演示
{
班级计划
{
公共静态异步任务Main()
{
Console.WriteLine(“waiting DoWork()”);
等待嫁妆();
控制台。WriteLine(“完成等待。按退出”);
Console.ReadLine();
}
公共静态异步任务DoWork()
{
尝试
{
等待任务(
Task.Run(()=>Foo()),
Task.Run(()=>Foo2()),
Task.Run(()=>Foo3())
);
}
捕获(例外e)
{
Console.WriteLine(“捕获异常:+e.Message”);
}
}
公共静态void Foo()
{
WriteLine(“启动Foo()”);
睡眠(1000);
Console.WriteLine(“Finishing Foo()”);
}
公共静态void Foo2()
{
Console.WriteLine(“启动Foo2()”);
睡眠(500);
WriteLine(“Foo2()正在抛出异常。”);
抛出新的InvalidOperationException(“OOPS!”);
}
公共静态void Foo3()
{
WriteLine(“启动Foo3()”);
睡眠(250);
Console.WriteLine(“Finishing Foo3()”);
}
}
}
如果编译并运行该代码,您将看到以下消息:
waiting DoWork()
Starting Foo()
Starting Foo2()
Starting Foo3()
Finishing Foo3()
Foo2() is throwing an exception.
Finishing Foo()
Caught exception: OOPS!
Finished awaiting. Press <RETURN> to exit.
waiting DoWork()
启动Foo()
启动Foo2()
启动Foo3()
第3(3)
Foo2()正在引发异常。
()
捕捉到异常:哎呀!
完成等待。按退出。
请记住,此答案仅适用于C#7.1或更新版本
DoWork()
方法没有异步运行,因为它缺少任何调用
等待DoWork()
正确异步,则需要使用Task.Run()
和wait Task.WhenAll()
,如下所示:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Demo
{
class Program
{
public static async Task Main()
{
Console.WriteLine("Awaiting DoWork()");
await DoWork();
Console.WriteLine("Finished awaiting. Press <RETURN> to exit.");
Console.ReadLine();
}
public static async Task DoWork()
{
try
{
await Task.WhenAll(
Task.Run(() => Foo()),
Task.Run(() => Foo2()),
Task.Run(() => Foo3())
);
}
catch (Exception e)
{
Console.WriteLine("Caught exception: " + e.Message);
}
}
public static void Foo()
{
Console.WriteLine("Starting Foo()");
Thread.Sleep(1000);
Console.WriteLine("Finishing Foo()");
}
public static void Foo2()
{
Console.WriteLine("Starting Foo2()");
Thread.Sleep(500);
Console.WriteLine("Foo2() is throwing an exception.");
throw new InvalidOperationException("OOPS!");
}
public static void Foo3()
{
Console.WriteLine("Starting Foo3()");
Thread.Sleep(250);
Console.WriteLine("Finishing Foo3()");
}
}
}
使用系统;
使用系统线程;
使用System.Threading.Tasks;
名称空间演示
{
班级计划
{
公共静态异步任务Main()
{
Console.WriteLine(“waiting DoWork()”);
等待嫁妆();
控制台。WriteLine(“完成等待。按退出”);
Console.ReadLine();
}
公共静态异步任务DoWork()
{
尝试
{
等待任务(
Task.Run(()=>Foo()),
Task.Run(()=>Foo2()),
Task.Run(()=>Foo3())
);
}
捕获(例外e)
{
Console.WriteLine(“捕获异常:+e.Message”);
}
}
公共静态void Foo()
{
WriteLine(“启动Foo()”);
睡眠(1000);
Console.WriteLine(“Finishing Foo()”);
}
公共静态void Foo2()
{
Console.WriteLine(“启动Foo2()”);
睡眠(500);
WriteLine(“Foo2()正在抛出异常。”);
抛出新的InvalidOperationException(“OOPS!”);
}
公共静态void Foo3()
{
WriteLine(“启动Foo3()”);
睡眠(250);
Console.WriteLine(“Finishing Foo3()”);
}
}
}
如果编译并运行该代码,您将看到以下消息:
waiting DoWork()
Starting Foo()
Starting Foo2()
Starting Foo3()
Finishing Foo3()
Foo2() is throwing an exception.
Finishing Foo()
Caught exception: OOPS!
Finished awaiting. Press <RETURN> to exit.
waiting DoWork()
启动Foo()
启动Foo2()
启动Foo3()
第3(3)
Foo2()正在引发异常。
()
捕捉到异常:哎呀!
完成等待。按退出。
请记住,此答案仅适用于C#7.1或更新版本
这不是问题所在,而是您的
DoWork()
方法没有异步运行。不管怎样,当我尝试您的代码的可编译版本时,我看到了异常。你能发布一个可编译的复制吗?我想你的问题实际上是DoWork()。等等,你对异步代码的阻塞。不要这样做。将其放在线程上或始终异步way@ClayVerValen因为正如我在问题中所写的那样,我添加了Console.WriteLine来理解调用了哪个方法,哪个失败了,第三个方法没有被调用,因此前两个方法中的一个生成异常不调用Foo3这一事实的可能重复并不意味着正在生成异常。这只意味着它没有被呼叫。如果您的程序冻结,我怀疑Foo1正在做的事情是集团化的