异步调用方法的两种方式
本文由控件中国网转载
当即将调用的方法执行比较耗时,且我们又不希望阻塞当前线程时,我们会选择异步执行该方法。
一、新建线程
1.无返回值的方法:
private static void Hello()
{
Console.WriteLine("New Thread");
Thread.Sleep(5000);
Console.WriteLine("New Thread:Hello");
}
对于这个方法可以这样来执行:
static void Main()
{
Console.WriteLine("Main Thread");
var newThread = new Thread(Hello);
newThread.Start();
Console.WriteLine("Main Thread");
}
输出如下:
Main Thread
New Thread
Main Thread
New Thread:Hello
Press any key to continue . . .
2.有返回值的方法:
private static string GenerateHello()
{
Console.WriteLine("New Thread");
Thread.Sleep(5000);
return "Hello";
}
由于新起线程并不能返回值,所以我们需要定义一个变量来保存这个值:
static void Main()
{
var strHello = string.Empty;
Console.WriteLine("Main Thread");
var newThread = new Thread(()=>strHello=GenerateHello());
newThread.Start();
Console.WriteLine("Main Thread");
Console.WriteLine(strHello);
}
输出如下:
Main Thread
New Thread
Main Thread
Press any key to continue . . .
可见,strHello这时并没有值,但是我们又想得到它的值,怎么办呢?看来只有阻塞当前线程了。
static void Main()
{
var strHello = string.Empty;
Console.WriteLine("Main Thread");
var newThread = new Thread(()=>strHello=GenerateHello());
newThread.Start();
Console.WriteLine("Main Thread");
while (true)
{
if(!string.IsNullOrEmpty(strHello))
{
Console.WriteLine("strHello:"+strHello);
break;
}
}
}
输出如下:
Main Thread
Main Thread
New Thread
strHello:Hello
Press any key to continue . . .
二、使用委托
1.无返回值的方法
private delegate void SayHello();
static void Main()
{
Console.WriteLine("Main Thread");
SayHello sayHello = Hello;
var async = sayHello.BeginInvoke(null, null);
Console.WriteLine("Main Thread");
sayHello.EndInvoke(async);
}
输出如下:
Main Thread
Main Thread
New Thread
New Thread:Hello
Press any key to continue . . .
EndInvoke会阻塞当前线程直到方法执行完成。
2.有返回值的方法:
使用委托来获取值就容易了。
private delegate string GetHello();
static void Main()
{
Console.WriteLine("Main Thread");
GetHello sayHello = GenerateHello;
var async = sayHello.BeginInvoke(null, null);
Console.WriteLine("Main Thread");
var strHello = sayHello.EndInvoke(async);
Console.WriteLine(strHello);
}
EndInvoke会返回委托所代表方法返回的值。
3.其他
(1).BeginInvoke
BeginInvoke的声明如下:
public virtual IAsyncResult BeginInvoke(AsyncCallback callback, object @object);
callback是异步方法执行完成时回执行的回调方法,而object则是传递给回调方法的参数。
三、小结
可见一般使用新起线程来异步调用无返回值的方法,而使用委托来调用有返回值的方法。
本文由控件中国网转载