C# 在单独的线程上启动事件处理程序类时GUI更新?

C# 在单独的线程上启动事件处理程序类时GUI更新?,c#,.net,multithreading,user-interface,C#,.net,Multithreading,User Interface,我们有一个DLL,它监视状态的变化,并从单独购买的产品中查找事件。事实上,这是西门子的一个屏幕弹出API,对于你们中可能知道这是什么的人来说。我正在使用C#.NET3.5作为平台 这个API需要很长时间来初始化,所以我们希望使用一个单独的线程来初始化它。目前,我们在一个名为ScreenPop的类中拥有该功能。该类监视2个事件,一个状态更改事件和一个屏幕弹出事件(告诉我们正在呼叫的客户的数据) 目前的实现方式不起作用,或者至少不可靠。在ScreenPop类中,有一个初始化方法,其中放置了所有长期运

我们有一个DLL,它监视状态的变化,并从单独购买的产品中查找事件。事实上,这是西门子的一个屏幕弹出API,对于你们中可能知道这是什么的人来说。我正在使用C#.NET3.5作为平台

这个API需要很长时间来初始化,所以我们希望使用一个单独的线程来初始化它。目前,我们在一个名为ScreenPop的类中拥有该功能。该类监视2个事件,一个状态更改事件和一个屏幕弹出事件(告诉我们正在呼叫的客户的数据)

目前的实现方式不起作用,或者至少不可靠。在ScreenPop类中,有一个初始化方法,其中放置了所有长期运行的启动代码。这是从类的构造函数调用的,如下所示:

public ScreenPop( string Address, int Ext, CallbackStatusType pStatusFunc,
      CallbackScreenPopType pPopFunc 
)
{
    CallbackStatus = pStatusFunc;
    CallbackPopup = pPopupFunc;

    Thread t = new Thread( StartInBackground );
    t.Start();
}
在GUI代码中,pStatusFunc的func更新一个状态标签,pPopupFunc的func将触发一些其他代码来执行屏幕弹出-现在它只显示来自事件的数据

有很多胶水不见了,但我希望你明白我的意思。这种方法的问题是GUI没有更新。我知道事件会触发,事件处理程序会运行,回调函数会被调用,它们看起来应该在运行,但GUI永远不会更新

所以,我的问题是,我是否应该放弃这一点,转而采用后台工作方法?或者我只是在更新GUI时遗漏了什么

请提供更多信息。。。 谢谢
Dave

您永远不能从其他线程更新GUI—只能从启动应用程序的UI线程更新。您需要使用Control.Invoke方法在UI线程上运行代码。表单实例frmMain.Invoke。

您永远不能从其他线程更新GUI—只能从启动应用程序的UI线程更新。您需要使用Control.Invoke方法在UI线程上运行代码。表单实例,frmMain.Invoke。

您不能在多线程单元中使用
WinForms
,要解决这个问题,您必须封送到UI线程以对其执行操作或获取结果。由于您使用的是C#3.5,因此可以使用lambdas、泛型和扩展方法来创建一个真正干净且易于使用的解决方案

public static class ControlExtensions
{
  public static TResult InvokeEx<TControl, TResult>(this TControl control,
                            Func<TControl, TResult> func)
    where TControl : Control
  {
    if (control.InvokeRequired)
    {
      return (TResult)control.Invoke(func, control);
    }
    else
    {
      return func(control);
    }
  }
}

您不能在多线程单元中使用
WinForms
,要解决这个问题,您必须将其封送到UI线程以对其执行操作或获取结果。由于您使用的是C#3.5,因此可以使用lambdas、泛型和扩展方法来创建一个真正干净且易于使用的解决方案

public static class ControlExtensions
{
  public static TResult InvokeEx<TControl, TResult>(this TControl control,
                            Func<TControl, TResult> func)
    where TControl : Control
  {
    if (control.InvokeRequired)
    {
      return (TResult)control.Invoke(func, control);
    }
    else
    {
      return func(control);
    }
  }
}

你能添加更多的代码吗?api是什么样子的?你能添加更多的代码吗?api是什么样子的?这很巧妙,好吧。太糟糕了,我还没有跟上lambdas、泛型和扩展方法的发展速度,所以你们这里的东西对我来说没什么意义……这很顺利,好吧。太遗憾了,我还没有掌握lambdas、泛型和扩展方法的最新进展,所以你们这里的内容对我来说意义不大……谢谢。我不知道为什么我没有注意到,但我无法获得正确的语法来保存我的******。谢谢。我不知道为什么我没有注意到,但我无法获得正确的语法来保存我的******。