net异步线程获取返回值的三种方式

时间:2023-03-08 23:15:03
net异步线程获取返回值的三种方式

方式一:endInvoke

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading; namespace ConsoleApplication6
{
//调用异步方法,并返回值:
//方式一,采用轮训的方式;
//申明一个委托;
public delegate int del(int a,int b);
class Program
{
private static int add(int i, int j)
{
Console.WriteLine("starting task....");
Thread.Sleep();
int result = i + j;
return result; }
static void Main(string[] args)
{
del d = new del(add);
IAsyncResult re = d.BeginInvoke(,,null,null);
while (!re.IsCompleted)
{
Console.WriteLine("异步线程进行中....");
}
int result = d.EndInvoke(re);
Console.WriteLine("result:"+result);
Console.ReadLine(); }
}
}

方式二:回调函数

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading; namespace ConsoleApplication6
{ class Program
{
public delegate int del(int a,int b);
static del d;
static double result = ; //使用全局的变量 private static int add(int i, int j)
{
Console.WriteLine("starting task....");
Thread.Sleep();
int result = i + j;
return result; }
private static void TaskFininshed(IAsyncResult ias)
{
result=d.EndInvoke(ias); Console.WriteLine("我来自异步线程...");
Console.WriteLine("异步结束!输出结果");
Console.WriteLine(result);
}
static void Main(string[] args)
{
d= new del(add);
IAsyncResult re = d.BeginInvoke(,,new AsyncCallback(TaskFininshed),null); Console.WriteLine("我来自主线程....");
Console.WriteLine("这个时候,主线中的代码,不会被堵塞...."); Console.ReadLine();//异步线程 是属于 后台线程,所以这里要阻止前台线程结束
}
}
}

waiteone的使用滴呀

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading; namespace ConsoleApplication6
{ class Program
{
public delegate int del(int a,int b);
static del d;
static double result = ; //使用全局的变量 private static int add(int i, int j)
{
Console.WriteLine("starting task....");
Thread.Sleep();
int result = i + j;
return result; }
private static void TaskFininshed(IAsyncResult ias)
{
result=d.EndInvoke(ias); Console.WriteLine("我来自异步线程...");
Console.WriteLine("异步结束!输出结果");
Console.WriteLine(result);
}
static void Main(string[] args)
{
d= new del(add);
IAsyncResult re = d.BeginInvoke(,,new AsyncCallback(TaskFininshed),null); Console.WriteLine("我来自主线程....");
Console.WriteLine("这个时候,主线中的代码,不会被堵塞...."); //Console.ReadLine();//异步线程 是属于 后台线程,所以这里要阻止前台线程结束
//这里我们不一定要使用 Console.ReadLine() 来等待异步线程的结束; //我们还可以 使用:
while (!re.AsyncWaitHandle.WaitOne(,false))
{
Console.WriteLine("主线程,在指定的时间内等你回来呀,亲....");
//如果指定时间为0,表示不等待,如果为-1,表示永远等待 } Console.WriteLine("同步 异步 都结束了....");
Console.ReadLine(); /*
*
*
* WaitOne的第一个参数表示要等待的毫秒数,
* 在指定时间之内,WaitOne方法将一直等待,直到异步调用完成,
* 并发出通知,WaitOne方法才返回true。
* 当等待指定时间之后,异步调用仍未完成,WaitOne方法返回false,
* 如果指定时间为0,表示不等待,如果为-1,表示永远等待,直到异步调用完成。
*
* */
}
}
}

再看当waitone的时间设置不一样时候的结果;
net异步线程获取返回值的三种方式

net异步线程获取返回值的三种方式