在TaskCompletionSource.Task上调用ContinueWith方法是否安全(已经调用了.SetResult)?

Inv*_*ion 18 .net c# asynchronous task-parallel-library

如果已经被调用,ContinueWith(...)在a 上使用该方法是否安全? TaskCompletionSource.TaskTaskCompletionSource.SetResult(...)

这个基本代码有望帮助构建问题:

// this was written inside the question box, please excuse any silly errors and lack of error checking (I'm not near VS right now)...

private WebClient _webClient = new WebClient();

public Task<string> GetExamplePage() {

    var tcs = new TaskCompletionSource<string>();

    web.DownloadStringCompleted += (s, ea) => tcs.SetResult(ea.Result);

    web.DownloadStringAsync(new URI(@"http://www.example.com/example.html"));

    return tcs.task;
}

public void ProcessExamplePage() {

    var task = GetExamplePage();

    Thread.Sleep(1000);

    task.ContinueWith(t => Console.WriteLine(t.Result)); // *line in question*
}
Run Code Online (Sandbox Code Playgroud)

Console.WriteLine(...)如果WebClient.DownloadStringCompleted事件在task.ContinueWith设置之前已经被触发,那么执行吗?

MSDN就是这么说的(Task.ContinueWith):

Task.ContinueWith方法

在当前任务完成之前,返回的任务将不会被安排执行,是否由于成功运行而完成,由于未处理的异常而导致故障,或者由于被取消而提前退出.

不幸的是,没有提到如果调用此方法并且任务已经完成会发生什么.

提前感谢您提供的任何信息!:)

小智 19

是的,这应该没问题,ContinueWith检查前一个任务是否完成,如果是,它将立即排队继续.

  • 这会启动一个新的异步操作还是会同步继续?由于``TaskCompletionSource``没有启动异步操作. (2认同)