Net中异步
阅读原文时间:2023年07月11日阅读:1

同步和异步
1.同步是指只启动一个线程
2.异步是指同时启动多个线程
3.同步方法会卡界面,异步方法不会卡界面
原因:异步方法启动了子线程执行任务,主线程得到释放
4.同步方法会慢。异步方法会快
原因:异步启动了.多个线程执行任务,占用了更多的资源
5 异步是无序的,原因:线程的启动和执行是由操作系统决定的,是无序的。

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private delegate void DoSomethingHandler(string name);

    private void Async\_Click(object sender, RoutedEventArgs e)  
    {  
        DoSomethingHandler method = t =>  
            Console.WriteLine("这里是Async\_Click,name={0},当前线程ID={1}",  
            t,Thread.CurrentThread.ManagedThreadId);  
        method("直接调用");  
        method.Invoke("Invoke");  
        method.BeginInvoke("BeginInvoke", null, null);//这就是异步调用  
    }

}

private void DoSomething(string name)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}",
name, Thread.CurrentThread.ManagedThreadId);
long lResult = 0;
for (int i=0;i<10000000;i++)
{
lResult += i;
}
Thread.Sleep(1000);
watch.Stop();
Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1},计算结果是{2},耗时{3}",
name, Thread.CurrentThread.ManagedThreadId, lResult, watch.ElapsedMilliseconds);
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Threading;
using System.Diagnostics;

namespace MyAsyncDemo
{
///

/// MainWindow.xaml 的交互逻辑 ///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private delegate void DoSomethingHandler(string name);
private void Async_Click(object sender, RoutedEventArgs e)
{
//DoSomethingHandler method = t =>
// Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}", t,Thread.CurrentThread.ManagedThreadId);
//method("直接调用");
//method.Invoke("Invoke");
//for (int i = 0; i < 5; i++) //{ Console.WriteLine("**********************这里是Async_Click***************"); string name = string.Format("Async_Click_{0}", 1); // DoSomethingHandler method = DoSomething; Func method = GetSomething;
AsyncCallback callback = t => Console.WriteLine("这里是AsyncCallback,当前线程ID={0},AsyncState={1}", Thread.CurrentThread.ManagedThreadId, t.AsyncState);
IAsyncResult result = method.BeginInvoke(name, callback, "Eleven");//这就是异步调用
//1. 一直等到结束,和同步的效果一样
//result.AsyncWaitHandle.WaitOne(-1);

        //2.等待异步线程结束的第二种方式  
        //while (!result.IsCompleted)  
        //{  
        //    Thread.Sleep(100);  
        //    Console.WriteLine("异步还没有结束,请继续等待");  
        //}

       /3.常用的第三种方式  
        long lResult = method.EndInvoke(result);  
        Console.WriteLine("结果是{0}", lResult);  
        // }  
        Console.WriteLine("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*这里是Async\_Click\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*");

    }  
    private long GetSomething(string name)  
    {  
        Stopwatch watch = new Stopwatch();  
        watch.Start();  
        Console.WriteLine("这里是GetSomething,name={0},当前线程ID={1}",  
            name, Thread.CurrentThread.ManagedThreadId);  
        long lResult = 0;  
        for (int i = 0; i < 10000000; i++)  
        {  
            lResult += i;  
        }  
        Thread.Sleep(1000);  
        watch.Stop();  
        Console.WriteLine("这里是GetSomething,name={0},当前线程ID={1},计算结果是{2},耗时{3}",  
          name, Thread.CurrentThread.ManagedThreadId, lResult, watch.ElapsedMilliseconds);  
        return lResult;  
    }  
    private void DoSomething(string name)  
    {  
        Stopwatch watch = new Stopwatch();  
        watch.Start();  
        Console.WriteLine("这里是Async\_Click,name={0},当前线程ID={1}",  
            name, Thread.CurrentThread.ManagedThreadId);  
        long lResult = 0;  
        for (int i=0;i<10000000;i++)  
        {  
            lResult += i;  
        }  
        Thread.Sleep(1000);  
        watch.Stop();  
          Console.WriteLine("这里是Async\_Click,name={0},当前线程ID={1},计算结果是{2},耗时{3}",  
            name, Thread.CurrentThread.ManagedThreadId, lResult, watch.ElapsedMilliseconds);  
    }

    private void Sync\_Click(object sender, RoutedEventArgs e)  
    {  
        for (int i = 0; i < 5;i++ )  
        {  
            string name = string.Format("Sync\_Click\_{0}", i);  
            DoSomething(name);  
        }  
    }

}  

}