gpt4 book ai didi

c# - 可以将 "async"与 ThreadStart 方法一起使用吗?

转载 作者:可可西里 更新时间:2023-11-01 08:46:38 33 4
gpt4 key购买 nike

我有一个 Windows 服务,它使用 Thread 和 SemaphoreSlim 每 60 秒执行一些“工作”。

class Daemon
{
private SemaphoreSlim _semaphore;
private Thread _thread;

public void Stop()
{
_semaphore.Release();
_thread.Join();
}

public void Start()
{
_semaphore = new SemaphoreSlim(0);
_thread = new Thread(DoWork);
_thread.Start();
}

private void DoWork()
{
while (true)
{
// Do some work here

// Wait for 60 seconds, or exit if the Semaphore is released
if (_semaphore.Wait(60 * 1000))
{
return;
}
}
}
}

我想从 DoWork 调用一个异步方法。为了使用 await 关键字,我必须将 async 添加到 DoWork:

private async void DoWork()
  1. 有什么理由不这样做吗?
  2. 如果 DoWork 已经在专用线程中运行,它真的能够异步运行吗?

最佳答案

可以这样做,但这不是一个好主意。一旦第一个未同步完成的 await 命中,其余工作将在 continuation 上完成,而不是您启动的线程 (_thread);您启动的线程将在第一个这样的 await 处终止。无法保证继续会返回到原始线程,在您的场景中,它不能 - 该线程现在已结束。这意味着:

  1. _thread无意义,不代表运行状态;因此,带有 _thread.Join();Stop() 方法不会执行您期望的操作
  2. 你已经创建了一个线程(分配线程是昂贵的,特别是因为堆栈的大小)只是让它几乎立即退出

这两个问题都可以通过使用 Task.Run 来启动此类操作来避免。

关于c# - 可以将 "async"与 ThreadStart 方法一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44364092/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com