我正在尝试调整现有程序(内部编写的)以使用与最初不同的库。我已经抽象了大部分特定于库的代码(似乎是更容易的部分)。
问题是,旧库将使用阻塞方法执行调用,而我们的内部程序期望调用阻塞方法,但新库使用异步方法。
我想知道等待异步操作完成的最佳实践是什么。我的第一个想法是有一个名为completed的 bool 标志,并在一个while循环中旋转,直到completed==true。
我应该指出,这是为了快速证明我试图为我的利益相关者组合在一起的概念,如果利益相关者签署了该项目,我将重写我们程序中的违规部分。但目前,我只需要等待调用异步方法的函数的阻塞,直到异步调用完成
最佳答案
我想你应该使用像 mutex 这样的东西来代替标志。 .
为了做到这一点,该库需要有一个事件来在异步调用完成后通知您。它看起来像这样:
- 创建互斥锁
- 在异步完成方法中,添加“myMutex.Release();”
- 在主方法中,调用异步方法后,添加“myMutex.WaitOne();”。这将阻塞线程,直到异步调用完成。
我已经有一段时间没有使用这个东西了,但我很确定它应该是这样工作的。
编辑:哎呀,我想我正在考虑 semaphore ,不是互斥锁:
private static Semaphore mySemaphore = new Semaphore(0, 1);
static void Main(string[] args)
{
Console.WriteLine("Waiting on async call");
(new Thread(ASyncCallCompleted)).Start();
mySemaphore.WaitOne();
Console.WriteLine("Waiting Completed");
}
private static void ASyncCallCompleted()
{
Thread.Sleep(5000);
mySemaphore.Release();
}
编辑 #2:根据 Thorarin 的建议;听起来这个类是为了处理 .Net 中的这种情况而设计的:
private static AutoResetEvent mySync = new AutoResetEvent(false);
static void Main(string[] args)
{
Console.WriteLine("Waiting on async call");
(new Thread(ASyncCallCompleted)).Start();
mySync.WaitOne();
Console.WriteLine("Waiting Completed");
Console.Read();
}
private static void ASyncCallCompleted()
{
Thread.Sleep(5000);
mySync.Set();
}
关于winforms - 最佳实践 : Blocking execution while waiting for an Async method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2110484/