我正在使用带有C#的Visual Studio处理Outlook加载项,我正在尝试不断更新任务窗格上的变量。我希望用户能够打开任务窗格,并实时观察变量增量。这是我正在做的工作的基本例子:
['a-b', 'a1-b1']
我正在尝试更新任务窗格,直到给定的时间范围结束。我试图更新计时器处理程序中的标签,但我无法更新它,因为它是在另一个线程中创建的。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:0)
Windows窗体中的控件绑定到特定线程,并且不是线程安全的。因此,如果从不同的线程调用控件的方法,则必须使用控件的一种调用方法来调用正确的线程。
基本上,您需要使用Control类的Invoke方法和InvokeRequired属性。此属性可用于确定是否必须调用invoke方法,如果您不知道哪个线程拥有控件,这可能很有用。
private void Button_Click(object sender, EventArgs e)
{
myThread = new Thread(new ThreadStart(ThreadFunction));
myThread.Start();
}
private void ThreadFunction()
{
MyThreadClass myThreadClassObject = new MyThreadClass(this);
myThreadClassObject.Run();
}
// The following code assumes a 'ListBox' and a 'Button' control are added to a form,
// containing a delegate which encapsulates a method that adds items to the listbox.
public class MyThreadClass
{
MyFormControl myFormControl1;
public MyThreadClass(MyFormControl myForm)
{
myFormControl1 = myForm;
}
public void Run()
{
// Execute the specified delegate on the thread that owns
// 'myFormControl1' control's underlying window handle.
myFormControl1.Invoke(myFormControl1.myDelegate);
}
}
更好的解决方案是使用SynchronizationContext返回的SynchronizationContext而不是跨线程封送的控件。