程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#線程系列講座(1):BeginInvoke和EndInvoke方法(4)

C#線程系列講座(1):BeginInvoke和EndInvoke方法(4)

編輯:關於C語言

六、使用回調方式返回結果

上面介紹的幾種方法實際上只相當於一種方法。這些方法雖然可以成功返回結果,也可以給用戶一些提示,但在這個過程中,整個程序就象死了一樣(如果讀者在GUI程序中使用這些方法就會非常明顯),要想在調用的過程中,程序仍然可以正常做其它的工作,就必須使用異步調用的方式。下面我們使用GUI程序來編寫一個例子,代碼如下:

private delegate int MyMethod();
private int method()
{
Thread.Sleep(10000);
return 100;
}
private void MethodCompleted(IAsyncResult asyncResult)
{
if (asyncResult == null) return;
textBox1.Text = (asyncResult.AsyncState as
MyMethod).EndInvoke(asyncResult).ToString();
}
private void button1_Click(object sender, EventArgs e)
{
MyMethod my = method;
IAsyncResult asyncResult = my.BeginInvoke(MethodCompleted, my);
}

要注意的是,這裡使用了BeginInvoke方法的最後兩個參數(如果被調用的方法含有參數的話,這些參數將作為BeginInvoke的前面一部分參數,如果沒有參數,BeginInvoke就只有兩個參數了)。第一個參數是回調方法委托類型,這個委托只有一個參數,就是IAsyncResult,如MethodCompleted方法所示。當method方法執行完後,系統會自動調用MethodCompleted方法。BeginInvoke的第二個參數需要向MethodCompleted方法中傳遞一些值,一般可以傳遞被調用方法的委托,如上面代碼中的my。這個值可以使用IAsyncResult.AsyncState屬性獲得。

由於上面的代碼通過異步的方式訪問的form上的一個textbox,因此,需要按ctrl+f5運行程序(不能直接按F5運行程序,否則無法在其他線程中訪問這個textbox,關於如果在其他線程中訪問GUI組件,並在後面的部分詳細介紹)。並在form上放一些其他的可視控件,然在點擊button1後,其它的控件仍然可以使用,就象什麼事都沒有發生過一樣,在10秒後,在textbox1中將輸出100。

七、其他組件的BeginXXX和EndXXX方法

在其他的.net組件中也有類似BeginInvoke和EndInvoke的方法,如System.Net.HttpWebRequest類的BeginGetResponse和EndGetResponse方法,下面是使用這兩個方法的一個例子:

private void requestCompleted(IAsyncResult asyncResult)
{
if (asyncResult == null) return;
System.Net.HttpWebRequest hwr = asyncResult.AsyncState as System.Net.HttpWebRequest;
System.Net.HttpWebResponse response =
(System.Net.HttpWebResponse)hwr.EndGetResponse(asyncResult);
System.IO.StreamReader sr = new
System.IO.StreamReader(response.GetResponseStream());
textBox1.Text = sr.ReadToEnd();
}
private delegate System.Net.HttpWebResponse RequestDelegate(System.Net.HttpWebRequest request);
private void button1_Click(object sender, EventArgs e)
{
System.Net.HttpWebRequest request =
(System.Net.HttpWebRequest)System.Net.WebRequest.Create("http://www.bianceng.cn");
IAsyncResult asyncResult =request.BeginGetResponse(requestCompleted, request);
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved