我有一个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()
答案 0 :(得分:7)
你可以这样做,但这不是一个好主意。一旦第一个await
点击未同步完成,其余的工作将在 continuation 上完成,而不是你开始的线程(_thread
);你开始的线程将在第一个await
终止。无法保证延续将返回到原始线程,而在您的方案中,不能 - 该线程现在是toast。这意味着:
_thread
毫无意义,并不代表行动的状态;因此,使用Stop()
的{{1}}方法无法按预期执行操作使用_thread.Join();
启动此类操作可以避免这两个问题。