C# 在单独的线程上启动事件处理程序类时GUI更新?
我们有一个DLL,它监视状态的变化,并从单独购买的产品中查找事件。事实上,这是西门子的一个屏幕弹出API,对于你们中可能知道这是什么的人来说。我正在使用C#.NET3.5作为平台 这个API需要很长时间来初始化,所以我们希望使用一个单独的线程来初始化它。目前,我们在一个名为ScreenPop的类中拥有该功能。该类监视2个事件,一个状态更改事件和一个屏幕弹出事件(告诉我们正在呼叫的客户的数据) 目前的实现方式不起作用,或者至少不可靠。在ScreenPop类中,有一个初始化方法,其中放置了所有长期运行的启动代码。这是从类的构造函数调用的,如下所示:C# 在单独的线程上启动事件处理程序类时GUI更新?,c#,.net,multithreading,user-interface,C#,.net,Multithreading,User Interface,我们有一个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、泛型和扩展方法的最新进展,所以你们这里的内容对我来说意义不大……谢谢。我不知道为什么我没有注意到,但我无法获得正确的语法来保存我的******。谢谢。我不知道为什么我没有注意到,但我无法获得正确的语法来保存我的******。