哦,也就是说对 ListBox1的调用必须检查它的InvokeRequired是否为True,如果为True的话就得更改Invoke?
delegate void SetTextCallback(string text);
private void SetText(string text)
{
if (this.listBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.listBox1.Items.Add(text);
}
}
好像不很方便啊!
SWC:怎么关闭检查?怎么设置?不会弄
public static bool CheckForIllegalCrossThreadCalls { get; set; }
你在所有过程的外面声明一个新的线程对象,不要再任何一个过程的里面声明
这个错误应该是由于实例化的线程与调用的线程不同才导致的吧?跟在哪声明有关系吗?
如果可行,能不能举个例子?
to jockey:
1、关闭检查是不安全的做法,虽然简单.在label的附值不会出现什么问题,但如果是其他关键对象出现这样的错误容易使程序崩溃(有点危言耸听),至少会导致检查不出错误。
2、嫌麻烦可以优化一下方法。
如将托管改为delegate void SetTextCallback(string text,Label l);这样就不用对每个label设置托管了。
如果能把第二个参数改为oject类型就更方便了,适用于除label之外的一些对象。不过还未实验过,不知道是否可行。