相关疑难解决方法(0)

何时应该使用TaskScheduler.Current作为参数调用Task.ContinueWith?

我们正在使用StackOverflow中的此代码片段来生成一个任务,该任务在第一个任务集合成功完成后立即完成.由于其执行的非线性特性,async/await实际上并不可行,因此此代码使用ContinueWith().它没有指定的TaskScheduler,虽然,这一个号码 来源都提到可能是危险的,因为它使用TaskScheduler.Current时,大多数开发人员通常希望TaskScheduler.Default从延续的行为.

流行的智慧似乎是你应该总是将一个显式的TaskScheduler传递给ContinueWith.但是,我还没有看到关于何时最合适的TaskScheduler的明确解释.

什么是最好TaskScheduler.Current进入的情况的具体例子ContinueWith(),而不是TaskScheduler.Default?做出这个决定时是否有遵循的经验法则?

对于上下文,这是我所指的代码片段:

public static Task<T> FirstSuccessfulTask<T>(IEnumerable<Task<T>> tasks)
{
    var taskList = tasks.ToList();
    var tcs = new TaskCompletionSource<T>();
    int remainingTasks = taskList.Count;
    foreach(var task in taskList)
    {
        task.ContinueWith(t =>
            if(task.Status == TaskStatus.RanToCompletion)
                tcs.TrySetResult(t.Result));
            else
                if(Interlocked.Decrement(ref remainingTasks) == 0)
                    tcs.SetException(new AggregateException(
                        tasks.SelectMany(t => t.Exception.InnerExceptions));
    }
    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading task-parallel-library

12
推荐指数
2
解决办法
677
查看次数

如何使用谓词实现Task.WhenAny()

我想异步执行几个任务,每个任务都会运行http请求,可以抛出异常或安全结束.我需要在第一个任务成功完成或所有任务都失败时完成.请指教.

c# task-parallel-library

5
推荐指数
2
解决办法
1070
查看次数

将任务排序为完成顺序

我看到Jon Skeet在大约一年前发表演讲,他在那里展示了一个C#5的片段,它将获取一系列任务并按照他们完成的顺序返回它们.

它使用了async/await和WhenAny并且非常漂亮,但我不能为我的生活记住它是如何工作的.现在我需要它.

我希望弄清楚如何使用类似于此的签名创建方法.

Task<IEnumerable<T>> InOrderOfCompletion<T>(IEnumerable<T> tasks) where T : Task
Run Code Online (Sandbox Code Playgroud)

可以使用如下:

public async Task<int> DelayedInt(int i)
{
    await Task.Delay(i*100);
    return i;
}

[Test]
public async void Test()
{
    Task<int>[] tasks = new[] {5, 7, 1, 3, 2, 6, 4}.Select(DelayedInt).ToArray();
    IEnumerable<Task<int>> ordered = await InOrderOfCompletion(tasks);

    Assert.That(ordered.Select(t => t.Result).ToArray(), Is.EqualTo(new [] {1,2,3,4,5,6,7}));
}
Run Code Online (Sandbox Code Playgroud)

我想出了以下内容,但感觉不像我记得那么简单

    async Task<IEnumerable<T>> InOrderOfCompletion<T>(IEnumerable<T> tasks) where T : Task
    {
        HashSet<Task> taskSet = new HashSet<Task>(tasks);
        List<T> results = new List<T>();
        while(taskSet.Count > 0)
        {
            T complete = (T) …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous task-parallel-library

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