【发布时间】:2011-08-31 04:19:17
【问题描述】:
任务1:
public Task SendMail(string email)
{
...
}
任务2:
public Task<int> SaveToDB(User user)
{
...
}
我需要做什么:
- task1 失败时,应返回“发送失败”信息;
- task1 成功后,task2 开始。
- 当 task2 失败时,应返回“保存失败”信息。
- task2 成功时,应返回“保存成功”信息。
请帮我找到解决办法:
public Task<string> SendAndSave(User user){
var task1 = SendMail(user.Email);
var task1Failed = task1.ContinueWith(t =>
{
var e = task1.Exception;
return "Send Failed";
},
TaskContinuationOptions.OnlyOnFaulted |
TaskContinuationOptions.ExecuteSynchronously);
var task2 = task1.ContinueWith(t =>
{
var save = SaveToDB(user);
try
{
int result = save.Result;
return "Save Succeeded";
}
catch(AggregateException ae)
{
return "Save Failed";
}
},
TaskContinuationOptions.NotOnFaulted);
return Task.Factory.ContinueWhenAny(new[] {task1Failed, task2}, t => t.Result);
}
当我运行它时,我收到一个错误。
我将其调用为:
var result = SendAndSave(user).Result;
错误发生在:
public Task<string> SendAndSave(User user)
{
...
return Task.Factory.ContinueWhenAny(new[] {task1Failed, task2}, t => t.Result); //Here: A task was cancelled
}
调试之后,我有两个问题:
Q1:task1、task1Failed、task2创建后,每个的值 CreationOption 属性为“无”,尽管其状态为 “等待激活”。似乎所有的延续选项都是 无效。
Q2:对于Task.Factory.ContinueWhenAny(new[] {task1Failed, task2}, t => t.Result),我们将其命名为“factoryTask”,即 ContinueWhenAny 似乎无效。在内部设置断点后 task1Failed、task2 和 factoryTask 中的每一个,我偶尔可以看到 factoryTask 中的断点首先被击中,尽管它 应在 task1Failed 或 task2 完成后点击。
有人可以帮忙吗?谢谢。
【问题讨论】:
-
也许你可以先告诉我们,错误到底是什么?
标签: c# .net multithreading task-parallel-library