111,120
社区成员
发帖
与我相关
我的任务
分享
private void OnTimer_ShowTime(Object source, ElapsedEventArgs e)
{
//toolStripStatusLabel_DateTime.Text = DateTime.Now.ToLongTimeString();
statusStrip.Items["toolStripStatusLabel_DateTime"].Text = DateTime.Now.ToLongTimeString();
}



public class MyForm : System.Windows.Forms.Form {
//UI 元素
private Label lblStatus;
private ProgressBar progressBar1;
//Delegate
private delegate void MyProgressEventsHandler(
object sender, MyProgressEvents e);
private void UpdateUI(object sender, MyProgressEvents e) {
lblStatus.Text = e.Msg;
myProgressControl.Value = e.PercentDone;
}
//ShowProgress 现在可以记录为可从任何线程调用的公共方法。
public void ShowProgress(string msg, int percentDone)
{
if(InvokeRequired)
{
System.EventArgs e = new MyProgressEvents(msg, percentDone);
object[] pList = { this, e };
BeginInvoke(new MyProgressEventsHandler(UpdateUI), pList);
}
else
{
UpdateUI(this, new MyProgressEvents(msg,
PercentDone));
}
}
private void btnStart_Click(object sender, EventArgs e)
{
//启动线程
Thread t = new Thread(new ParameterizedThreadStart(RunsOnWorkerThread));
t.IsBackground = true;
t.Start(input);
}
//线程执行函数
private void RunsOnWorkerThread()
{
int i = 0;
while(...) //loop
{
DoSomethingSlow();
ShowProgress("test",i);
++i;
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
可以解决问题,但是还是没理解为什么。
1、究竟是哪个线程调用了 StatusStrip 状态栏,而引发的异常。
2、跨线程调用是怎么回事,微软好像不建议关闭跨线程访问检查的。