来自:http://developer.51cto.com/art/200908/147771.htm
C#线程操作常见的操作方法是什么呢?C#线程操作方法的具体实现是什么样子的呢?那么下面我们来看看具体的C#线程操作的六大方法分别是什么,以及他们的特点是什么?
C#线程操作一、用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程
在C#中使用线程的方法很多,使用委托的BeginInvoke和EndInvoke方法就是其中之一。BeginInvoke方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用。我们可以通过四种方法从EndInvoke方法来获得返回值。
C#线程操作二、直接使用EndInvoke方法来获得返回值
当使用BeginInvoke异步调用方法时,如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕。如下面的代码所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace MyThread { class Program { private static int newTask(int ms) { Console.WriteLine("任务开始"); Thread.Sleep(ms); Random random = new Random(); int n = random.Next(10000); Console.WriteLine("任务完成"); return n; } private delegate int NewTaskDelegate(int ms); static void Main(string[] args) { NewTaskDelegate task = newTask; IAsyncResult asyncResult = task.BeginInvoke(2000, null, null); // EndInvoke方法将被阻塞2秒 int result = task.EndInvoke(asyncResult); Console.WriteLine(result); } } }
Thread.Sleep(10000);
static void Main(string[] args) { NewTaskDelegate task = newTask; IAsyncResult asyncResult = task.BeginInvoke(2000, null, null); while (!asyncResult.IsCompleted) { Console.Write("*"); Thread.Sleep(100); } // 由于异步调用已经完成,因此, EndInvoke会立刻返回结果 int result = task.EndInvoke(asyncResult); Console.WriteLine(result); }
由于是异步,所以“*”可能会在“任务开始”前输出,如上图所示。
C#线程操作四、使用WaitOne方法等待异步方法执行完成
使用WaitOne方法是另外一种判断异步调用是否完成的方法。代码如下:
static void Main(string[] args) { NewTaskDelegate task = newTask; IAsyncResult asyncResult = task.BeginInvoke(2000, null, null); while (!asyncResult.AsyncWaitHandle.WaitOne(100, false)) { Console.Write("*"); } int result = task.EndInvoke(asyncResult); Console.WriteLine(result); }
private delegate int MyMethod(); private static int method() { Thread.Sleep(10000); return 100; } private static 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); }
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.cnblogs.com"); IAsyncResult asyncResult =request.BeginGetResponse(requestCompleted, request); }