標籤:ros 返回 event .com ges 無法 工作 src partial
以上兩種顯示方法都實現傳回值寫法,無傳回值兩種方法基本無區別。
由執行時間結果看出,非同步可以直接結束主線程,方法也不需要主線程處理過多的代碼。
委託需要在主線程編寫代碼,並且寫法有些複雜。
using System;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace AsyncAwait{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; } private void btclear_Click(object sender, EventArgs e) { tbshow.Text = ""; } private void showMsg(string sMsg) { tbshow.Text += Thread.CurrentThread.ManagedThreadId + sMsg + DateTime.Now.ToString() + "\r\n"; } private void btRun_Click(object sender, EventArgs e) { //非同步,分線程處理,多次點擊,還可以等待返回結果。 asyncTask(); showMsg("btRun_asyncTaskClick.end.."); } public async void asyncTask() { string x = await asyncTask2(); showMsg(x); Thread.Sleep(1000); showMsg("asyncTask.end"); } public async Task<string> asyncTask2() { return await Task.Run(() => { //類比一個超大工作量的進程 showMsg("run..BeginInvoke.start."); Random rd = new Random(); Thread.Sleep(rd.Next(3000, 6000)); showMsg("run..BeginInvoke.end."); return "傳回值:asyncTask2End" + DateTime.Now.ToString(); }); } public delegate void MainFun(string a,out string b); private void btInvoke_Click(object sender, EventArgs e) { string sReturn = ""; //委託當執行EndInvoke時,線程被鎖死了,無法多次點擊 MainFun myMainFun = new MainFun(BeginInvoke); IAsyncResult myIAsyncResult = myMainFun.BeginInvoke("a", out sReturn, null, null); myMainFun.EndInvoke(out sReturn,myIAsyncResult); showMsg(sReturn); Thread.Sleep(1000); showMsg("runInvoke.end.."); } public void BeginInvoke(string a,out string b) { //類比一個超大工作量的進程 showMsg("run..BeginInvoke.start."); Random rd = new Random(); Thread.Sleep(rd.Next(3000, 6000)); showMsg("run..BeginInvoke.end."); b = "傳回值:BeginInvokeEnd" + DateTime.Now.ToString(); } private void btrun2_Click(object sender, EventArgs e) { string sReturn = ""; BeginInvoke("a",out sReturn); showMsg("run.end.."); } }}
C#非同步和委託