是否可以使用" async"使用ThreadStart方法?

时间:2017-06-05 07:44:50

标签: c# async-await

我有一个Windows服务,它使用Thread和SemaphoreSlim来执行一些" work"每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已经在专用线程内运行,那么DoWork是否能够异步运行?

1 个答案:

答案 0 :(得分:7)

可以这样做,但这不是一个好主意。一旦第一个await点击未同步完成,其余的工作将在 continuation 上完成,而不是你开始的线程(_thread);你开始的线程将在第一个await终止。无法保证延续将返回到原始线程,而在您的方案中不能 - 该线程现在是toast。这意味着:

  1. _thread毫无意义,并不代表行动的状态;因此,使用Stop()的{​​{1}}方法无法按预期执行操作
  2. 你创建了一个线程(分配线程很昂贵,特别是因为堆栈的大小)只是让它几乎立即退出
  3. 使用_thread.Join();启动此类操作可以避免这两个问题。