C#多线程的应用(二)使用委托开启多线程

分类:.NET
 标签:C#,线程
   修改 | 阅读(492)| 评论(0)

C#多线程应用(一)

1、用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程

BeginInvoke方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用。

class Program
{
    private delegate int NewTaskDelegate(int ms);
    private static int newTask(int ms)
    {
        Console.WriteLine("任务开始");
        Thread.Sleep(ms);
        Random random = new Random();
        int n = random.Next(10000);
        Console.WriteLine("任务完成");
        return n;
    }
    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);
        Console.Read();
    }
}

2、使用IAsyncResult.IsCompleted属性来判断异步调用是否完成

class Program
{
    private delegate int NewTaskDelegate(int ms);
    private static int newTask(int ms)
    {
        Console.WriteLine("任务开始");
        Thread.Sleep(ms);
        Random random = new Random();
        int n = random.Next(10000);
        Console.WriteLine("任务完成");
        return n;
    }
    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);
        Console.Read();
    }
}

3、使用WaitOne方法等待异步方法执行完成

WaitOne的第一个参数表示要等待的毫秒数,在指定时间之内,WaitOne方法将一直等待,直到异步调用完成,并发出通知,WaitOne方法才返回true。当等待指定时间之后,异步调用仍未完成,WaitOne方法返回false,如果指定时间为0,表示不等待,如果为-1,表示永远等待,直到异步调用完成。

class Program
{
    private delegate int NewTaskDelegate(int ms);
    private static int newTask(int ms)
    {
        Console.WriteLine("任务开始");
        Thread.Sleep(ms);
        Random random = new Random();
        int n = random.Next(10000);
        Console.WriteLine("任务完成");
        return n;
    }
    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);
        Console.Read();
    }
}

4、使用回调方式返回结果

要注意的是“my.BeginInvoke(3,300, MethodCompleted, my)”,BeginInvoke方法的参数传递方式:
前面一部分(3,300)是其委托本身的参数。
倒数第二个参数(MethodCompleted)是回调方法委托类型,他是回调方法的委托,此委托没有返回值,有一个IAsyncResult类型的参数,当method方法执行完后,系统会自动调用MethodCompleted方法。
最后一个参数(my)需要向MethodCompleted方法中传递一些值,一般可以传递被调用方法的委托,这个值可以使用IAsyncResult.AsyncState属性获得。

class Program
{
    private delegate int MyMethod(int second, int millisecond);
    //线程执行方法
    private static int method(int second, int millisecond)
    {
        Console.WriteLine("线程休眠" + (second * 1000 + millisecond) + "毫秒");
        Thread.Sleep(second * 1000 + millisecond);
        Random random = new Random();
        return random.Next(10000);
    }
    //回调方法
    private static void MethodCompleted(IAsyncResult asyncResult)
    {
        if (asyncResult == null || asyncResult.AsyncState == null)
        {
            Console.WriteLine("回调失败!!!");
            return;
        }
        int result = (asyncResult.AsyncState as MyMethod).EndInvoke(asyncResult);
        Console.WriteLine("任务完成,结果:" + result);
    }
    static void Main(string[] args)
    {
        MyMethod my = method;
        IAsyncResult asyncResult = my.BeginInvoke(3, 300, MethodCompleted, my);
        Console.WriteLine("任务开始");
        Console.Read();
    }
}


5、其他组件的BeginXXX和EndXXX方法

在其他的.net组件中也有类似BeginInvoke和EndInvoke的方法,如System.Net.HttpWebRequest类的BeginGetResponse和EndGetResponse方法。其使用方法类似于委托类型的BeginInvoke和EndInvoke方法,例如:

class Program
{
    //回调函数
    private static void requestCompleted(IAsyncResult asyncResult)
    {
        if (asyncResult == null || asyncResult.AsyncState == null)
        {
            Console.WriteLine("回调失败");
            return;
        }
        HttpWebRequest hwr = asyncResult.AsyncState as HttpWebRequest;
        HttpWebResponse response = (HttpWebResponse)hwr.EndGetResponse(asyncResult);
        StreamReader sr = new StreamReader(response.GetResponseStream());
        string str = sr.ReadToEnd();
        Console.WriteLine("返回流长度:" + str.Length);
    }
    static void Main(string[] args)
    {
        HttpWebRequest request =
(HttpWebRequest)WebRequest.Create("http://www.baidu.com");
        //异步请求
        IAsyncResult asyncResult = request.BeginGetResponse(requestCompleted, request);
        Console.WriteLine("任务开始");
        Console.Read();
    }
}






您的昵称:*
QQ登录(无需注册直接登录可进行回复)
您的邮箱:(填写邮箱,如有回复可进行邮件通知)
验证码:
点击刷新