每次以下运行时,都会捕获 Mike 的异常。
WhenAll 是顺序的,涉及每个任务之间的延续上下文,还是所有任务都同时运行?如果它是并发的,为什么 Mike 的异常总是被捕获而不是 Mitch 的。我推迟了迈克,以便给米奇一个机会。如果它是连续的,那么使它并发涉及什么?发出 Web 请求/进行文件处理时会应用并发执行吗?
假设这段代码更严重,这是否是一种明智的异步方法?该场景将是几种方法 - Jason、Mitch 和 Mike - 在没有阻塞的情况下同时运行并在全部完成后继续事件处理程序?关于异常处理的幼稚实现,我应该注意哪些注意事项?有什么需要注意的问题或潜在问题吗?
private async void button1_Click(object sender,EventArgs e)
{
try
{
AsyncJason c1 = new AsyncJason();
await c1.Hello();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public class AsyncJason
{
public AsyncJason()
{
}
public async Task Hello()
{
var j = await GetJasonAsync();
string[] dankeSchon = await Task.WhenAll(new Task<string>[] {GetJasonAsync(), GetMikeAsync(), GetMitchAsync()});
}
private async Task<string> GetJasonAsync()
{
var result = await Task.Run<string>(() => GetJason());
return result;
}
private string GetJason()
{
return "Jason";
}
private async Task<string> GetMitchAsync()
{
var result = await Task.Run<string>(() => GetMitch());
return result;
}
private string GetMitch()
{
throw new ArgumentException("Mitch is an idiot", "none");
}
private async Task<string> GetMikeAsync()
{
await Task.Delay(3000);
var result = await Task.Run<string>(() => GetMike());
return result;
}
private string GetMike()
{
throw new ArgumentException("Mike is an idiot", "none");
}
}