下面这两种方法的行为方式是否相同?它们的工作方式是否存在内部差异?这两种方法都将释放UI线程,并在延迟结束后继续执行。
public async Task DoSomethingAsync()
{
Console.WriteLine("Test Async start");
//Any long running operation
await Task.Delay(5000);
Console.WriteLine("Test Async end");
}
public void TestTask()
{
Console.WriteLine("Test Task start");
Task.Run(() =>
{
//Any long running operation
Thread.Sleep(10000);
}
).ContinueWith((prevTask) =>
{
Console.WriteLine("Test Task end");
});
}
**output**:
Test Async start
Test Task start
Test Async end
Test Task end
发布于 2018-06-07 03:30:17
Asynchronous programming with async and await
等待async和
关键字不会导致创建额外的线程。异步方法不需要多线程,因为异步方法不在自己的线程上运行。该方法在当前同步上下文上运行,并且仅当该方法处于活动状态时才使用线程上的时间。
您不需要为任务使用System.Threading。下面的代码是由于CancellationToken的缘故。
一个不同之处在于,对于Task,您可以访问主(UI)线程上的属性。
请参见数量。您甚至可以写入主线程,但这可能不是一个好的做法。
async Task<int> TaskDelayAsync(CancellationToken ct, IProgress<int> progress)
{
Debug.WriteLine(Quantity);
int i = 0;
while (true)
{
i++;
//Debug.WriteLine(i);
progress.Report(i);
ct.ThrowIfCancellationRequested();
await Task.Delay(500);
}
return i;
}
https://stackoverflow.com/questions/50727717
复制相似问题