【问题标题】:calling event that implements at other thread in C#在 C# 中的其他线程上实现的调用事件
【发布时间】:2012-04-11 12:51:47
【问题描述】:

我有一个带有 Socket 的类,监听客户端接收数据。当接收到新数据时,我想调用一个事件(如果已实现),但正如您所知,每个连接都有自己的线程,因此事件将在该线程上运行,而您知道其余的。您不能使用表单控件。 我如何调用事件(或调用它)。我对线程和网络编程真的很陌生,所以我很欣赏任何例子。

public class HVremotechooser
{
    public delegate void NewOrder(Order order);
    public event NewOrder nOrder;

    //... (code elided)


    public void ReceiveCallback(IAsyncResult AsyncCall)  // new connection of client
    {

         //... (code elided)
         if (nOrder != null)
              nOrder(Order);   // calling the event "nOrder"
         //... (code elided)

    }

}

谢谢。

【问题讨论】:

标签: c# multithreading events networking invoke


【解决方案1】:

如果您想从非 UI 线程更新表单,则必须调用该操作。我通常做的事情如下:

private void LongRunningBackgroundThread() {
   // lots of work
   ...
   // Update my form
   InvokeIfRequired(() => {
       ...update form...
   }
}

private static void InvokeIfRequired(Action a) {
    if (control.InvokeRequired) {
        control.Invoke(a);
    } else {
        a();
    }
}

herehere

【讨论】:

  • 我知道这一点,但在我的情况下它没有用,因为我编写了一个组件,它有一些事件。使用我的组件的程序员将实现事件,我不希望他/她关心调用(线程)。
  • 我需要调用已实现的事件,以便第三个程序员轻松地使用表单元素完成他/她的工作。
【解决方案2】:

上周我在使用 Dispatcher.BeginInvoke 方法的 Silverlight 应用程序中遇到了类似的问题。对于 Windows 表单,使用 Control.BeginInvoke 可能会更容易(尽管我相信两者都应该工作):http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke.aspx

【讨论】:

    【解决方案3】:

    您可以使用InvokeBeginInvoke 等典型的编组操作将委托的执行注入到UI 线程中。只需将 ISynchronizeInvokeSynchronizationContext 的实例传递给您的类以方便编组。

    但是,在您的情况下,我不会这样做。因为,大概无论如何,这些回调是由于套接字事件而发生的,因此可能它们很可能会变得艰难而沉重。您绝对不想用所有这些活动来抨击您的 UI 线程。相反,将所有相关数据打包并放入一个集合中,然后 UI 线程可以在更合理的时间间隔内使用System.Windows.Forms.Timer 进行轮询。

    我一直在撕毁这些编组操作。它们被高估和过度使用。请记住,在 UI 和工作线程之间共享数据和信号的一般方法有两种。

    • 通过工作线程中的InvokeBeginInvoke 推送方法
    • 通过 UI 线程中的System.Windows.Forms.Timer 拉取方法

    pull 方法可以而且通常更优雅。

    【讨论】:

      【解决方案4】:

      UI 线程是一个 UI 问题。在我看来,你不应该担心在这段代码中调用 ui 线程。相反,事件的消费者应该执行Invoke 或他们碰巧需要做的任何其他线程操作。这样,如果 UI 人员需要更改他们的策略(例如通过使用计时器),您的非 UI 相关代码将不需要更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多