0x01 无参数,无返回值的异步方法:
static void Main(){
new Thread(DoSomething).Start();
}
public void DoSomething(){...}
0x02 有参数,无返回值的异步方法:
//使用Threading
//在这里要异步执行的函数的参数arg只能是Object类型,而且参数只能有一个。
//如果想用这种方法传多个参数,可以将参数添加到List<Object>,转换为Object传入函数中。
static void Main(){
var asy = new Thread(new ParameterizedThreadStart(DoSomething1));
asy.Start(arg);
}
//使用匿名委托方法
new Thread(delegate(){
DoSomething2("arg1", "arg2", "arg3");
}).Start();
//Lambada也是很好用的
new Thread(() => {
DoSomething2("arg1","arg2","arg3");
}).Start();
//使用Task.Run
Task.Run(() =>{
DoSomething2("arg1", "arg2", "arg3");
});
public static void DoSomething1(object arg){...}
public static void DoSomething2(string arg1,string arg2,string arg3){...}
0x03 有返回值,有参数的异步方法
//如果需要返回值,那么Thread就无能为力啦,但是Task作为Thread的升级,必然解决了这个问题~
static void Main()
{
var result=Task.Run<string>(() =>
{
return DoSomething2("arg1", "arg2", "arg3");
});
Console.WriteLine(result.Result);
Console.WriteLine("必须等上面一句执行完我才能显示...");
Console.Read();
}
public static string DoSomething2(string arg1,string arg2,string arg3){
Thread.Sleep(1000);
return "Demo By DoubleVoid!";
}
下面才是重头!
0x04 大名鼎鼎的async/await
static void Main(string[] args){
Test(); //异步执行
Console.WriteLine("我会最先显示出来的!");
}
static async void Test(){
var str = await GetString(); //使用await会一直等待GetString()执行结束才会执行下一句
Console.WriteLine("GetString: {0}", str);
}
static async Task<string> GetString(){
return await Task.Run(() =>{
Thread.Sleep(1000);
return "Demo By DoubleVoid!";
});
}
//await只能在被async声明的函数中使用