相关疑难解决方法(0)

从同步方法调用异步方法

我试图从同步方法运行异步方法.但我不能等待异步,因为我在一个同步方法方法.我不能理解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)

.net c# multithreading asynchronous

14
推荐指数
2
解决办法
3万
查看次数

继续Task <T>时保留异常

我有一个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)

.net c# task-parallel-library

10
推荐指数
3
解决办法
2997
查看次数

Microsoft.Bcl.Async中是否存在ExceptionDispatchInfo的模拟?

ExceptionDispatchInfoMicrosoft.Bcl.Async中有类似的吗?我找不到类似的东西.

这个问题是由我的另一个问题引发的.当异常的父级task可用时,我可以使用task.GetAwaiter().GetResult()@StephenCleary建议重新抛出.

当它不可用时我有什么选择?

.net c# task-parallel-library async-await

4
推荐指数
1
解决办法
1428
查看次数