首页 / C# / c# – 异步的行为等待新线程
c# – 异步的行为等待新线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 异步的行为等待新线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2212字,纯文字阅读大概需要4分钟。
内容图文
![c# – 异步的行为等待新线程](/upload/InfoBanner/zyjiaocheng/756/68aaf49980544459b4acc3c2aca8121c.jpg)
我试图了解async / await的精确行为,并且在我周围缠绕时遇到了一些麻烦.
考虑这个例子:
public async void StartThread()
{
while(true){
SomeOtherClass.SomeSynchronousStuff();
var something = await SomeOtherClass.SomeOtherAsyncMethod();
}
}
public void ConstructorForThisClass()
{
Thread thread = new Thread(StartThread);
thread.Start();
}
我对async / await的理解是,幕后发生的事情是编译器本质上是将代码转换成一堆回调并为每个回调存储状态对象.
所以根据这个,我的问题是:
>新创建的线程是否会异步运行?意思是,当线程正在等待SomeOtherAsyncMethod时,它是否会被释放以用于其他工作?
>如果前面的条件为真,那么当SomeOtherAsyncMethod返回时,线程是否会结束并且线程池线程取代它?
>我如何在线程池线程而不是托管线程上发布StartThread函数?
>当一个等待的方法返回给它的调用者时,它是否被强制在调用它的线程上恢复,或者任何自由线程可以取代它?
解决方法:
Will the newly created thread be running asynchronously?
你的措辞有点问题.线程的创建是完全同步的.
Meaning, while the thread is awaiting the SomeOtherAsyncMethod, will it be
freed up to work on other work?
您是使用Thread类手动创建线程,而不是Threadpool线程.它不在AppDomain中共享.一旦它到达第一个await关键字,它将被释放,但由于你在无限循环中使用它,它将不会被用于除此之外的任何其他工作.
If the preceding is true, will the thread simply end and a thread pool
thread take its place when the SomeOtherAsyncMethod returns?
忽略前者,因为你不使用ConfigureAwait(false),所以继续将在任意ThreadPool线程上运行.但这实际上取决于背景.由于您在新线程上运行此委托,所以会发生这种情况.但是,如果你是从UI线程运行它,那么继续尝试通过相关的TaskScheduler和相应的SynchronizationContext将自身编组到UI消息循环中.
How would I go about issuing the StartThread function on a thread pool
thread rather than a managed thread?
Thread类和ThreadPool类启动的所有线程都是托管线程.如果你的意思是“如何在线程池上运行此委托”,那么答案是通过Task.Run或通过ThreadPool静态类.
When an awaitable method returns to its caller, is it forced to resume
on the thread that calls it or can any free thread take its place?
如果在没有ConfigureAwait(false)的情况下运行,它将被强制转换为当前的TaskScheduler及其底层的SynchronizationContext.这意味着如果你在UI消息循环中运行,并在那里调用await,它将尝试将延续发布到它.如果没有可用的自定义TaskScheduler,它将使用默认的一个,即线程池调度程序.
内容总结
以上是互联网集市为您收集整理的c# – 异步的行为等待新线程全部内容,希望文章能够帮你解决c# – 异步的行为等待新线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。