syn*_*cis 35 c# multithreading async-await
我已经阅读了很多文章,但仍然无法理解这一部分.
考虑以下代码:
private async void button1_Click(object sender, EventArgs e)
{
await Dosomething();
}
private async Task<string> Dosomething()
{
await Task.Run((() => "Do Work"));
return "I am done";
}
Run Code Online (Sandbox Code Playgroud)
第一个问题:
当我单击按钮时,它将调用DoSomething并等待通过调用Task.Run(如果我没有记错)从线程池创建线程的任务,并且所有这些都是异步运行的.所以我实现了创建一个完成我的工作但是异步执行的线程?但是考虑到我不需要任何结果,我只是希望在没有得到任何结果的情况下完成工作,是否真的需要使用async/await,如果是这样,怎么样?
第二个问题:
在异步运行线程时,它是如何工作的?它是在主UI上运行但是在单独的线程上运行还是在单独的线程上运行并且在该方法中是异步的?
DVK*_*DVK 20
在C#中执行fire and forget方法的最简单方法是什么?
The*_*kis 10
该类型Task<TResult>
要求您TResult
从任务中返回a .如果你没有任何东西可以返回,你可以使用Task
(顺便说一下,它是基类Task<TResult>
).
但请记住,任务不是一个线程.任务是要完成的工作,而线程是工作者.随着您的程序运行,作业和工作人员变得可用且不可用.在幕后,图书馆会将您的工作分配给可用的工作人员,因为创建新工作人员是一项代价高昂的操作,因此通常更愿意通过线程池重用现有工作人员.
Mat*_*zer 10
有一个很大的区别,如果你不这样做await
的Task
,或者你await
吧:
案例你不这样做await
它:DoSomething
被调用,但在执行下一句DoSomething
Task
尚未完成.
案例你await
它:DoSomething
被调用,下一句被执行一次DoSomething
Task
已经完成.
因此,需要async
/ await
将取决于你想要如何调用DoSomething
:如果你不这样做 await
,就像把它称为火与忘记方式.
它是在主UI上运行但是在单独的线程上运行还是在单独的线程上运行并且在该方法中是异步的?
异步代码有时意味着其他线程(请参阅此Q&A 异步与多线程 - 是否存在差异?).也就是说,如果代码是在与UI一个单独的线程中执行的,或者它让它在恢复时继续处理UI线程,这很好,因为UI循环仍然可以在其他任务完成时更新屏幕平行而不冻结UI.
异步方法(即async
方法)是一种语法糖,用于告诉编译器await
应将语句视为状态机.C#编译器将您的async
/ await
代码转换为状态机,等待Task
结果的代码在等待的代码之后执行.
您可能想查看其他问答:
[...]但这是否意味着"async/await"将触发一个线程,Task.Run也会触发一个线程,或者它们都是同一个线程?
使用async
- await
并不意味着"我创建一个线程".以优雅的方式实现延续只是一种语法糖.任务可能是也可能不是线程.例如,Task.FromResult(true)
创建一个假任务,以便能够实现异步方法而无需创建线程:
public Task<bool> SomeAsync()
{
// This way, this method either decides if its code is asynchronous or
// synchronous, but the caller can await it anyway!
return Task.FromResult(true);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
36536 次 |
最近记录: |