每次运行下面的代码时,Mike的异常都会被捕获。
WhenAll是顺序执行的吗?在每个任务之间有一个延续上下文吗?还是所有任务都并发运行?如果是并发的,为什么总是捕获Mike的异常而不是Mitch的异常?我在Mike上设置了延迟,以给Mitch一个机会。如果是顺序执行,如何使其并发?在进行Web请求/文件处理时是否应用并发执行?
假设这段代码更为严肃,是否采用异步方式是明智的做法?场景是多个方法Jason、Mitch和Mike并发运行,不会阻塞,并在所有完成后继续事件处理程序。关于我天真的异常处理实现,应该注意哪些考虑因素?有哪些问题或潜在问题需要注意?
WhenAll是顺序执行的吗?在每个任务之间有一个延续上下文吗?还是所有任务都并发运行?如果是并发的,为什么总是捕获Mike的异常而不是Mitch的异常?我在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");
}
}
WhenAll
无法控制任务的执行方式(即所有任务都可以在执行WhenAll
时完成)... - Alexei Levenkov