【问题标题】:WPF C# How to handle multiple processes? [duplicate]WPF C#如何处理多个进程? [复制]
【发布时间】:2020-05-15 03:18:58
【问题描述】:

我正在监控设备,使用下面的示例代码,一切正常。问题是关于如何同时处理每个进程。让我解释一下。

在监控设备时,我们会在设备断开连接时触发一个事件。例如,如果我们必须等待每个设备重新启动或重新连接到网络,我们在开始下一个命令之前使用 thread.sleep()。唯一的问题是,如果我们有大量设备,每个设备将同时完成一个,可能需要很长时间才能完成所有设备。在这个例子中,睡眠时间为 10 秒,每分钟只能完成 6 台设备。

我应该如何为每个设备启动 1 个单独的进程,并(几乎)同时运行它?还是?

monitor.DeviceDisconnected += this.OnDeviceDisconnected;

private void OnDeviceDisconnected(object sender, DeviceDataEventArgs e)
{
    ......

    Thread.Sleep(10000);

    ......
}

【问题讨论】:

  • 永远不要在 UI 应用程序的主线程中调用 Thread.Sleep,因为它会阻塞线程并因此阻塞 UI。如果您需要等待,请改用await Task.Delay
  • 您需要查看Task Parallel Library 进行异步编程。点击链接并通读文档,您将了解如何继续操作。
  • 这里有很多问题,但您正在寻找的是异步编程。我推荐 Tim Corey 的 YouTube 视频作为一个很好的起点:youtu.be/2moh18sh5p4

标签: c# wpf process


【解决方案1】:

我会假设事件是在主线程上引发的,因为 UI 冻结了。正如@Clemens 所提到的,您应该避免使用 Thread.Sleep ,因为这会阻塞线程,如果在主线程上这样做会非常混乱。

要使用await,该方法需要标记async。异步方法需要返回 TaskTask<T>void。通常建议返回一个 Task,因为这可以让调用者知道方法何时完成以及是否发生任何异常。

由于它是一个事件处理程序,调用者不会关心任务何时完成,但我们应该注意不要丢失任何异常。所以方法签名看起来像这样

private async voidOnDeviceDisconnected(object sender, DeviceDataEventArgs e){
{
    ......
    try{
        await Task.Delay(TimeSpan.FromSeconds(10));
        ....
     }
     catch(Exception e){
         // Handle exception
     }
}

【讨论】:

  • 谢谢乔纳斯,这对于突出我犯的错字很有用..我将延迟设置为 1000 而不是 10000..并且不明白为什么这么快...:)
  • 这就是为什么写Task.Delay(TimeSpan.FromSeconds(10)) 比写Task.Delay(n) 更好的原因之一。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多