作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
样例代码:
class Program
{
static void sleepFunc()
{
int before = Thread.CurrentThread.ManagedThreadId;
Thread.Sleep(5000);
int after = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"{before} -> sleep -> {after}");
}
static async void delayFunc()
{
int before = Thread.CurrentThread.ManagedThreadId;
await Task.Delay(5000);
int after = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"{before} -> delay -> {after}");
}
static void Main(string[] args)
{
List<Thread> threads = new List<Thread>();
for(int i = 0; i < 10; i++)
{
var thread = new Thread(sleepFunc);
thread.Start();
threads.Add(thread);
}
Thread.Sleep(1000); // just to separate the result sections
for (int i = 0; i < 10; i++)
{
var thread = new Thread(delayFunc);
thread.Start();
threads.Add(thread);
}
Console.ReadLine();
}
}
样本输出:
3 -> sleep -> 3
7 -> sleep -> 7
4 -> sleep -> 4
5 -> sleep -> 5
6 -> sleep -> 6
8 -> sleep -> 8
9 -> sleep -> 9
10 -> sleep -> 10
11 -> sleep -> 11
12 -> sleep -> 12
21 -> delay -> 25
18 -> delay -> 37
15 -> delay -> 36
16 -> delay -> 32
19 -> delay -> 24
20 -> delay -> 27
13 -> delay -> 32
17 -> delay -> 27
22 -> delay -> 25
14 -> delay -> 26
Thread.Sleep()的延续在同一显式创建的线程上运行,而Task.Delay()的延续在不同的(线程池)线程上运行。
最佳答案
Since the continuation always runs on the thread pool, is it just pointless/wasteful/antipattern to use a new Thread(func) if there is an await anywhere inside the func?
Is there any way to force a task to continue on the original non-thread-pool new thread?
await
都会在该上下文中继续(当然,默认情况下……如果您调用
ConfigureAwait(false)
,则不允许这样做)。
async
/
await
并不是很好地结合在一起。
await
语句是一种以线性,同步同步方式组成异步代码的方法。通常,如果创建了显式线程,那是因为您打算在该线程中执行所有工作。在这种情况下甚至没有理由调用异步方法。
await
,那么根据定义,您的代码会短暂运行一段时间,然后在等待异步完成的过程中被暂停。在这种情况下,没有理由使用显式线程。当您不等待其他时间时,线程池是在短暂的时间间隔内执行自己的代码的理想方法。
I'm asking because I read someone recommending to put a long running loop (for socket communication for example) in a Thread instead of in a Task, but it seems that if they call ReadAsync then it ends up being a Task on the thread pool anyway, and the new Thread was pointless?
await
是一种理想技术的经典示例。套接字(从CPU的角度来看)需要很长的时间来等待某件事的发生,而被非常短的时间段打断,以便处理显示的任何数据。通常情况下,将整个线程专用于从套接字读取是个坏主意。在.NET之前很久,仍然存在一个异步I/O模型,该模型允许线程池处理这些间歇性完成的I/O操作。请参见“I/O完成端口”。实际上,.NET套接字API是在该API之上构建的。
关于c# - 在新的Thread()中等待是否毫无意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64603106/
我是一名优秀的程序员,十分优秀!