Thread thread = new Thread(new ThreadStart(() =>
{
VisualTarget visualTarget = new VisualTarget(hostVisual);
var control = new UserControl1();
control.Arrange(new Rect(new Point(), content.RenderSize));
visualTarget.RootVisual = control;
System.Windows.Threading.Dispatcher.Run();
}));
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
//同步步執行
System.Windows.Application.Current.Dispatcher.Invoke(() =>
{
//操作界面控件
});
beginInvoke //異步執行
System.Windows.Application.Current.Dispatcher.Invoke(() =>
{
//操作界面控件
});
//異步執行
//var sendtask = Task.Factory.StartNew(() =>
//{
//});
//Task 為一種線程 CancellationTokenSource 控制Task 執行
- Task t1 = Task.Factory.StartNew(delegate { MyMethodA(); });
- Task t2 = Task.Factory.StartNew(delegate { MyMethodB(); });
- t1.Wait();
- t2.Wait();
下面是3中方式(摘取實例)
Control.CheckForIllegalCrossThreadCalls=false;來解決。設置為false表示不對錯誤線程的調用進行捕獲。
delegate void SafeSetText(string strMsg); private void SetText(string strMsg) { if(textbox1.InvokeRequired) { SafeSetText objSet=new SafeSetText(SetText); textbox1.Invoke(objSet,new object[]{strMsg}); } else { textbox1.Text=strMsg; } }
在線程內需要設置textbox的值時調用SetText方法既可。我們還可以采用另一種委托的方式來實現,那就是匿名代理,例如:
delegate void SafeSetText(string strMsg); private void SetText2(string strMsg) { SafeSetText objSet = delegate(string str) { textBox1.Text = str; } textBox1.Invoke(objSet,new object[]{strMsg}); }