同步和异步
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
{
///
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
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);
}
}
}
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章