【发布时间】:2019-11-06 11:51:00
【问题描述】:
假设我创建了一个类名 myClass 并且这个类有一个名为 myValue 的任何类型的属性,没关系,比如:
class myClass
{
public delegate void OverTheLimitDlg(int arg);
public event OverTheLimitDlg OverTheLimit;
public myClass()
{
myValue = 0;
}
private int myvalue = 0;
public int myValue
{
get { return myvalue;}
set
{
myValue = value;
if(value > 5)
OvertheLimit(value);
}
}
}
我在表单上有一个名为 myLabel 的 winforms 标签,我在 Form Load 事件中创建了一个类型为 myClass 的对象,订阅它的 OverTheLimit 事件并启动 backgroundworker:
myClass myObj;
private void Form_Load(object sender, EventArgs e)
{
myObj = new myClass();
myObj.OverTheLimit += SubsMethod;
backgroundworker.RunWorkerAsync();
}
private void backgroundworker_DoWork(...)
{
myObj.myValue = 10;
//Some expressions.
}
private void SubsMethod(int someInt)
{
myLabel.Text = "Oh it's over the limit!";
}
总结:我创建了一个类,从它实例化的对象可以触发事件。我让对象在一个线程中触发事件,它运行一个影响 GUI 对象的方法,一个创建并在另一个线程上运行的对象。我从来没有尝试过。在这种情况下会发生什么?它会导致错误吗?谢谢。
【问题讨论】:
-
当您需要更新值时,可以使用 BackgroundWorker 的 ReportProgress 方法。因此,如果某个值超出了您的类定义的限制,您可以从ProgressChanged 处理程序中引发您的事件。此事件在调用者的线程中引发。 UI 线程,在这里。
-
不要让坏事发生并且不被注意。
Control.CheckForIllegalCrossThreadCalls = trueis your friend!
标签: c# multithreading winforms events