-1

我正在使用 EventWaitHandle() 处理程序。在等待 10 秒的 ButtonClick 事件中调用此处理程序。还有另一个工作线程在处理程序上接收到一些数据调用 Set() 。问题是 WaitOne() 在超时发生后返回 false。工作线程没有运行并且看起来像是被挂起,因此没有调用 Set()。超时结束后,我的工作线程恢复并调用 Set() 方法。为了验证我在没有 EventWaitHandle() 的情况下尝试检查我的工作线程是否真的需要 10 秒的时间,但它没有,并且 Set() 方法立即生效。我不确定为什么工作线程在我是 C# 新手中发生超时后运行。提前致谢

主窗口.xaml.cs

public static EventWaitHandle autoResetEvent = new EventWaitHandle(false, EventResetMode.AutoReset);

XYZDialogBox.cs

private void BtnConnect_Click(object sender, RoutedEventArgs e)
{
MainWindow.autoResetEvent.Reset();
if (!MainWindow.autoResetEvent.WaitOne(10000))
                {
                    //Line number details is not received from Service
                    MessageBox.Show("Timeout");

                    //now disconnect and exit
                    strCommand = "#cmddisconnect " + tbIPAddress.Text + " #";
                    tcpClient.AddCommandAsync(strCommand);
                    return;
                }
}

ABC.cs

public void ABC(ref string strData)
{
   while(strData != "")
   {
     //do something
     MainWindow.autoResetEvent.Set();
   }
}
4

1 回答 1

0

根据您的代码使用异步等待模式:

private async void BtnConnect_Click(object sender, RoutedEventArgs e)
{
    // await frees up the main thread but halts execution of this method until finished.
    var result  = await Task.Run(() => 
     {
          //Do something that takes time.
          // This is now in another thread.
          return MyService.ServiceCall(arg);
     });

     // use result here synchronously.
}

顺便说一句,这里的示例是使用异步等待模式的非常基本的案例。理想情况下,您的服务应该有一个库来实现异步方法调用,该方法调用返回一个可等待的任务。那看起来像这样。

private async void BtnConnect_Click(object sender, RoutedEventArgs e)
{
    bool success = await MyService.ServiceCallAsync(args); // async service call.

    if(success)
    {
       // handle
       return;
    }

    // an error occurred.
}
于 2020-03-31T16:05:53.737 回答