异步委托怎么写( 二 )

< students.Count; i++) { students[i].Total = (students[i].Chinese + students[i].Math + students[i].English); students[i].Average = students[i].Total / 3; // 计算进度百分比 int percent = (i + 1) * 100 / students.Count; // 报告进度 worker.ReportProgress(percent); } // 将结果传给 BackgroundWorker e.Result = students; } ////// 模拟从数据库获取10000个学生信息 ////// public List GetStudents() { List students = new List(); Random random = new Random(); for (int i = 0; i < 10000; i++) { students.Add(new Student { Name = "学生" + i, Chinese = random.Next(100), Math = random.Next(100), English = random.Next(100) }); } return students; } }}代码下载地址:.rar 。
5.c# 通过异步委托的执行结果更新UI界面已经加注释了,你看一下吧:
lblStatus.Text = "执行中,请稍候……";
FunclongTask = new Func(delegate()
{
// 模拟长时间任务
Thread.Sleep(2000);
// 返回任务结果:5
return 5;
});
// 发起一次异步调用,实际上就是在.net线程池中执行longTask
// 这时由于是其它线程在工作,UI线程未被阻塞,所以窗体不会假死
longTask.BeginInvoke(ar =>
{
// 使用EndInvoke获取到任务结果(5)
int result = longTask.EndInvoke(ar);
// 使用Control.Invoke方法将5显示到一个label上,如果没有Invoke,
// 直接写lblStatus.Text="5",将会抛出跨线程访问UI控件的异常
Invoke(new Action(() => lblStatus.Text = "执行结果是:" + result));
}, null);
6.C#using System;
using System.Threading;
//使用委托调用异步例子
namespace
{
class AsyncDelegatesBlocked
{
public static int Add(int op1, int op2, out int result)
{
Thread.Sleep(3000); // Simulating work
return (result = op1 + op2);
}
public delegate int AddDelegate(int op1, int op2,
out int result);//声明AddDelegate委托
static void Main()
{
int result;
/*定义一个AddDelegate类型委托add,将方法Add绑定到委托实例上*/
AddDelegate add = new AddDelegate(Add);
Console.WriteLine("[Main] Invoking the asynchronous " +
"Add method");
/*BeginInvoke 方法用于启动异步调用 。它与您需要异步执行的方法具有相同的参数,还有两个额外的参数
*BeginInvoke 立即返回,不等待异步调用完成 。BeginInvoke 返回 IasyncResult,可用于监视调用进度 。*/
//定义IAsyncResult接口类型实例iAR
//6, 42, out result为异步执行的方法的参数列表
IAsyncResult iAR = add.BeginInvoke(6, 42, out result,
null, null);
// Here we're simulating doing some work before
// blocking on the Add method's completion.
Console.Write("[Main] Doing other work");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(200);
Console.Write(".");
}
Console.WriteLine(" [Main] Waiting for Add to finish");
/*使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,
* 使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用 EndInvoke 。
* 注意:异步调用完成时会发出 WaitHandle 信号,可以通过WaitOne 来等待它*/
iAR.AsyncWaitHandle.WaitOne();
Console.WriteLine("[Main] Add finished, cleaning up");
/*EndInvoke 方法用于检索异步调用结果 。调用 BeginInvoke 后可随时调用 EndInvoke 方法;
* 如果异步调用未完成,EndInvoke 将一直阻塞到异步调用完成 。
* EndInvoke 的参数包括所需要异步执行的方法的 out 和 ref 参数以及由 BeginInvoke 返回的 IAsyncResult 。*/
add.EndInvoke(out result, iAR);
Console.WriteLine("[Main] The result is {0}", result);
Console.ReadLine();
}
}
}
7.c# 线程的异步调用与同步调用我这样写 是 异步调用呢? 还是同步调用???