我试图从同步方法运行异步方法.但我不能等待的异步,因为我在一个同步方法方法.我不能理解TPL,因为这是我第一次使用它.
private void GetAllData()
{
GetData1()
GetData2()
GetData3()
}
Run Code Online (Sandbox Code Playgroud)
每个方法都需要先前的方法来完成,因为第一个方法的数据用于第二个方法.
但是,在每个方法中我想要启动多个Task操作以加快性能.然后我想等他们所有人完成.
GetData1看起来像这样
internal static void GetData1 ()
{
const int CONCURRENCY_LEVEL = 15;
List<Task<Data>> dataTasks = new List<Task<Data>>();
for (int item = 0; item < TotalItems; item++)
{
dataTasks.Add(MyAyncMethod(State[item]));
}
int taskIndex = 0;
//Schedule tasks to concurency level (or all)
List<Task<Data>> runningTasks = new List<Task<Data>>();
while (taskIndex < CONCURRENCY_LEVEL && taskIndex < dataTasks.Count)
{
runningTasks.Add(dataTasks[taskIndex]);
taskIndex++;
}
//Start tasks and wait for them …Run Code Online (Sandbox Code Playgroud) 我有一个Task <T>:
Task<A> someTask = ...
Run Code Online (Sandbox Code Playgroud)
此任务可能导致成功,出现故障或取消.
我希望在任务成功时转换结果,如果没有则保留结果.
someTask抛出异常时,这似乎非常困难.
我尝试过的:
Task<B> resultTask = StartMyTask().ContinueWith<B>(
t => Foo(t.Result),
TaskContinuationOptions.OnlyOnRanToCompletion);
Run Code Online (Sandbox Code Playgroud)
resultTask如果出现someTask故障,则会导致取消.我想要它的错.
Task<B> resultTask = StartMyTask().ContinueWith<B>(
t => Foo(t.Result));
Run Code Online (Sandbox Code Playgroud)
这会破坏Visual Studio调试器,因为.Result会引发异常.如果按F5,resultTask按预期出现故障,但它闻起来有气味.
有没有什么办法让resultTask具有相同的结果一样someTask,如果someTask故障?
基本上我要做的是用任务来表达这样的事情:
int F()
{
throw new SomeException();
}
string G(int x)
{
return x.ToString();
}
try
{
string result = G(F());
}
catch (SomeException e)
{
...
}
Run Code Online (Sandbox Code Playgroud) ExceptionDispatchInfo在Microsoft.Bcl.Async中有类似的吗?我找不到类似的东西.
这个问题是由我的另一个问题引发的.当异常的父级task可用时,我可以使用task.GetAwaiter().GetResult()@StephenCleary建议重新抛出.
当它不可用时我有什么选择?