winforms - 最佳实践 : Blocking execution while waiting for an Async method

标签 winforms c#-3.0 asynchronous multithreading blocking

我正在尝试调整现有程序(内部编写的)以使用与最初不同的库。我已经抽象了大部分特定于库的代码(似乎是更容易的部分)。

问题是,旧库将使用阻塞方法执行调用,而我们的内部程序期望调用阻塞方法,但新库使用异步方法。

我想知道等待异步操作完成的最佳实践是什么。我的第一个想法是有一个名为completed的 bool 标志,并在一个while循环中旋转,直到completed==true。

我应该指出,这是为了快速证明我试图为我的利益相关者组合在一起的概念,如果利益相关者签署了该项目,我将重写我们程序中的违规部分。但目前,我只需要等待调用异步方法的函数的阻塞,直到异步调用完成

最佳答案

我想你应该使用像 mutex 这样的东西来代替标志。 .

为了做到这一点,该库需要有一个事件来在异步调用完成后通知您。它看起来像这样:

  1. 创建互斥锁
  2. 在异步完成方法中,添加“myMutex.Release();”
  3. 在主方法中,调用异步方法后,添加“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/

相关文章:

c# - 玩弄匿名类型

c# - C#套接字BeginAccept事件停止触发

c# - 尝试以编程方式将图像添加到资源。设置图片源时出现System.ArgumentException

c# - 使用 MVC 和 Ninject 作为 IoC 容器构建 WinForms 应用程序

c# - C# (.NET) 中的范围变量是否可行

c# - C#获取用户登录名

c# - 如何在长时间运行的功能期间更新 UI(文本字段)?

c# - 如何向多行文本框添加一行?

c# - 排队来自 silverlight 的 WCF 调用

javascript - 遍历 Q 中的 promise