wpf 線程與界面線程


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});
}
復制代碼

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM