资源简介
c# 实现多线程的操作,轮询等待回调等异步操作,适合初学者的源码
代码片段和文件信息
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
public delegate string AsyncDelegate(int callDuration out int threadId);
class Program
{
static void Main(string[] args)
{
Fun1();
Fun2();
Fun3();
Fun4();
Console.ReadLine();
}
private static int threadId;
//阻塞等待 使用 EndInvoke 等待异步调用
static void Fun1()
{
//创建示例类的实例。
AsyncDemo ad = new AsyncDemo();
// 创建委托
AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
// 委托在这里开始异步调用。
IAsyncResult ar = dlgt.BeginInvoke(5000out threadId null null);
//人为的线程阻塞。
Thread.Sleep(0);
Console.WriteLine(“主线程 {0}开始工作“Thread.CurrentThread.ManagedThreadId);
// 委托开始EndInvoke调用,这个过程会使主线程等待异步调用完成并返回结果。
string ret = dlgt.EndInvoke(out threadId ar);
Console.WriteLine(“使用 EndInvoke 等待异步调用!!!“);
Console.WriteLine(“异步线程 {0}返回值 \“{1}\“.“ threadId ret);
Console.WriteLine(“主线程{0}结束工作“ Thread.CurrentThread.ManagedThreadId);
}
//阻塞等待 使用 WaitHandle 等待异步调用
static void Fun2()
{
AsyncDemo ad = new AsyncDemo();
AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
IAsyncResult ar = dlgt.BeginInvoke(5000out threadId null null);
Thread.Sleep(0);
Console.WriteLine(“主线程 {0}开始工作“ Thread.CurrentThread.ManagedThreadId);
//主线程在这里等待,直到异步线程执行完。
ar.AsyncWaitHandle.WaitOne();
// 和前一方案的区别在于,你可以在异步调用完成后,获取异步调用返回值之前
//在这里做点任何你想作的事。
//调用EndInvoke获取异步调用的返回结果.
string ret = dlgt.EndInvoke(out threadId ar);
Console.WriteLine(“使用 WaitHandle 等待异步调用!!!“);
Console.WriteLine(“异步线程 {0}返回值 \“{1}\“.“ threadId ret);
Console.WriteLine(“主线程{0}结束工作“ Thread.CurrentThread.ManagedThreadId);
}
//轮询状态 轮询异步调用完成
static void Fun3()
{
AsyncDemo ad = new AsyncDemo();
AsyncDelegate dlgt = new AsyncDelegate(ad.TestMethod);
IAsyncResult ar = dlgt.BeginInvoke(5000out threadId null null);
Console.WriteLine(“使用轮询异步调用!!!“);
Console.WriteLine(“主线程 {0}开始工作“ Thread.CurrentThread.ManagedThreadId);
//这里每隔10毫秒就检测(轮询)一下异步执行的状态,
//直到异步调用完成,IsCompleted的值变为ture为止。
while (ar.IsCompleted == false)
{
Thread.Sleep(10);
}
//还记得微软的那个善意的提醒吗?虽然IsCompleted为true了,
//我们还是调用一下EndInvoke,来获取返回值。
string ret = dlgt.EndInvoke(out threadId ar);
Console.WriteLine(“异步线程 {0}返回值 \“{1}\“.“ threadId ret);
Console.
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 16384 2010-06-07 16:59 ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
文件 15872 2010-06-07 16:59 ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.pdb
文件 5632 2005-11-11 22:25 ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.vshost.exe
文件 1972 2010-06-06 16:39 ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.csproj
文件 617 2010-06-07 17:01 ConsoleApplication1\ConsoleApplication1\obj\ConsoleApplication1.csproj.FileListAbsolute.txt
文件 16384 2010-06-07 16:59 ConsoleApplication1\ConsoleApplication1\obj\Debug\ConsoleApplication1.exe
文件 15872 2010-06-07 16:59 ConsoleApplication1\ConsoleApplication1\obj\Debug\ConsoleApplication1.pdb
文件 5691 2010-06-07 17:05 ConsoleApplication1\ConsoleApplication1\Program.cs
文件 1221 2010-06-06 16:39 ConsoleApplication1\ConsoleApplication1\Properties\AssemblyInfo.cs
文件 946 2010-06-06 16:39 ConsoleApplication1\ConsoleApplication1.sln
..A..H. 10752 2010-06-07 17:05 ConsoleApplication1\ConsoleApplication1.suo
目录 0 2010-06-06 16:39 ConsoleApplication1\ConsoleApplication1\obj\Debug\TempPE
目录 0 2010-06-06 16:43 ConsoleApplication1\ConsoleApplication1\bin\Debug
目录 0 2010-06-07 16:59 ConsoleApplication1\ConsoleApplication1\obj\Debug
目录 0 2010-06-06 16:38 ConsoleApplication1\ConsoleApplication1\bin
目录 0 2010-06-06 16:41 ConsoleApplication1\ConsoleApplication1\obj
目录 0 2010-06-06 16:39 ConsoleApplication1\ConsoleApplication1\Properties
目录 0 2010-06-07 17:05 ConsoleApplication1\ConsoleApplication1
目录 0 2010-06-06 16:39 ConsoleApplication1
----------- --------- ---------- ----- ----
91343 19
- 上一篇:GridView的增删改查功能
- 下一篇:blowfish算法的C#实现
评论
共有 条评论