引自博客:Yes I Can 什么是.Net异步调用机制
代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.ComponentModel;//ISynchronizeInvoke
using System.Runtime.Remoting.Messaging;//AsyncResult
using System.Windows.Forms;
using System.Threading;
namespace WinApp
{
public class AsyncQueryHelper
{
FrmProgressBar frmProgressBar = null;
public AsyncQueryHelper()
{
frmProgressBar = new FrmProgressBar(10);
}
public delegate DataSet ExecQueryHandler(DataSet dsRequest);
public ExecQueryHandler execQueryHandlerInstance = null;
private AsyncCallback asyncCallbackInstance = null;
public void ExecQuery(DataSet dsRequest)
{
frmProgressBar.StartThread();
asyncCallbackInstance = new AsyncCallback(ExecAsyncCallBack);//<=>asyncCallbackInstance = ExecAsyncCallBack;
if (execQueryHandlerInstance != null)
{
//execQueryHandlerInstance.BeginInvoke(dsRequest, asyncCallbackInstance, execQueryHandlerInstance);
IAsyncResult result = execQueryHandlerInstance.BeginInvoke(dsRequest, ExecAsyncCallBack, execQueryHandlerInstance);//同上
//=======================WaitOne=======================//
//阻碍当前线程,直到异步调用结束
result.AsyncWaitHandle.WaitOne();
//开始其他工作.
//DoAnotherWork();
//=======================WaitAll=======================//
/*
IAsyncResult result1 = execQueryHandlerInstance.BeginInvoke(dsRequest, ExecAsyncCallBack, execQueryHandlerInstance);
IAsyncResult result2 = execQueryHandlerInstance.BeginInvoke(dsRequest, ExecAsyncCallBack, execQueryHandlerInstance);
//把所有异步的句柄保存到WaitHandle 对象中
WaitHandle[] waitHandles = { result1.AsyncWaitHandle, result2.AsyncWaitHandle };
//阻碍当前线程,直到所有异步调用结束
WaitHandle.WaitAll(waitHandles);
//开始其他工作
//DoAnotherWork();
*/
//====WaitAny:可以使用 WaitAny 来指定某个/某几个委托先等待=====//
/*
WaitHandle[] oneWaitHandle = { result1.AsyncWaitHandle };
WaitHandle.WaitAny(oneWaitHandle);
//开始其他工作
//DoAnotherWork();
*/
}
}
public delegate void BindDataToGrid(DataSet dsReponse);
public BindDataToGrid bindDataToGridInstance = null;
public DataGridView dataGridView = null;
public void ExecAsyncCallBack(IAsyncResult asyncResult)
{
endHandlerInstance = new EndHandler(frmProgressBar.EndThread);
frmProgressBar.BeginInvoke(endHandlerInstance, null);//执行控件的BeginInvoke
////======================1=========================////
//此处的asyncResult.AsyncState对象就是BeginInvoke里的最后一个参数
/*
ExecQueryHandler execQueryHandler = asyncResult.AsyncState as ExecQueryHandler;
DataSet dsReponse = null;
if (asyncResult.IsCompleted)
{
if (execQueryHandler != null)
{
dsReponse = new DataSet();
dsReponse = execQueryHandler.EndInvoke(asyncResult);
ISynchronizeInvoke async = this.dataGridView;
if (async.InvokeRequired)
{
async.Invoke(bindDataToGridInstance, new object[] { dsReponse });
}
}
}
*/
////======================2=========================////
AsyncResult originAsyncResult = asyncResult as AsyncResult;
if (originAsyncResult != null)
{
ExecQueryHandler execQuery = (ExecQueryHandler)originAsyncResult.AsyncDelegate;
DataSet dsReponse = execQuery.EndInvoke(asyncResult);
ISynchronizeInvoke async = this.dataGridView;
//InvokeRequired == false表示来自主线程;为true表示来自异步线程
if (dataGridView != null && bindDataToGridInstance != null)
{
if (async.InvokeRequired)
{
async.Invoke(bindDataToGridInstance, new object[] { dsReponse });
}
}
asyncResult.AsyncWaitHandle.Close();//显示的释放资源
}
}
public delegate void SendRequestHandler();
public SendRequestHandler sendRequestHandlerInstance = null;
public delegate void EndHandler();
public EndHandler endHandlerInstance = null;
static void DoAnotherJob()
{
Thread.Sleep(1000);//需要1秒才能完成这个工作
MessageBox.Show("[{0}]:Do Another Job", DateTime.Now.ToString());
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.ComponentModel;//ISynchronizeInvoke
using System.Runtime.Remoting.Messaging;//AsyncResult
using System.Windows.Forms;
using System.Threading;
namespace WinApp
{
public class AsyncQueryHelper
{
FrmProgressBar frmProgressBar = null;
public AsyncQueryHelper()
{
frmProgressBar = new FrmProgressBar(10);
}
public delegate DataSet ExecQueryHandler(DataSet dsRequest);
public ExecQueryHandler execQueryHandlerInstance = null;
private AsyncCallback asyncCallbackInstance = null;
public void ExecQuery(DataSet dsRequest)
{
frmProgressBar.StartThread();
asyncCallbackInstance = new AsyncCallback(ExecAsyncCallBack);//<=>asyncCallbackInstance = ExecAsyncCallBack;
if (execQueryHandlerInstance != null)
{
//execQueryHandlerInstance.BeginInvoke(dsRequest, asyncCallbackInstance, execQueryHandlerInstance);
IAsyncResult result = execQueryHandlerInstance.BeginInvoke(dsRequest, ExecAsyncCallBack, execQueryHandlerInstance);//同上
//=======================WaitOne=======================//
//阻碍当前线程,直到异步调用结束
result.AsyncWaitHandle.WaitOne();
//开始其他工作.
//DoAnotherWork();
//=======================WaitAll=======================//
/*
IAsyncResult result1 = execQueryHandlerInstance.BeginInvoke(dsRequest, ExecAsyncCallBack, execQueryHandlerInstance);
IAsyncResult result2 = execQueryHandlerInstance.BeginInvoke(dsRequest, ExecAsyncCallBack, execQueryHandlerInstance);
//把所有异步的句柄保存到WaitHandle 对象中
WaitHandle[] waitHandles = { result1.AsyncWaitHandle, result2.AsyncWaitHandle };
//阻碍当前线程,直到所有异步调用结束
WaitHandle.WaitAll(waitHandles);
//开始其他工作
//DoAnotherWork();
*/
//====WaitAny:可以使用 WaitAny 来指定某个/某几个委托先等待=====//
/*
WaitHandle[] oneWaitHandle = { result1.AsyncWaitHandle };
WaitHandle.WaitAny(oneWaitHandle);
//开始其他工作
//DoAnotherWork();
*/
}
}
public delegate void BindDataToGrid(DataSet dsReponse);
public BindDataToGrid bindDataToGridInstance = null;
public DataGridView dataGridView = null;
public void ExecAsyncCallBack(IAsyncResult asyncResult)
{
endHandlerInstance = new EndHandler(frmProgressBar.EndThread);
frmProgressBar.BeginInvoke(endHandlerInstance, null);//执行控件的BeginInvoke
////======================1=========================////
//此处的asyncResult.AsyncState对象就是BeginInvoke里的最后一个参数
/*
ExecQueryHandler execQueryHandler = asyncResult.AsyncState as ExecQueryHandler;
DataSet dsReponse = null;
if (asyncResult.IsCompleted)
{
if (execQueryHandler != null)
{
dsReponse = new DataSet();
dsReponse = execQueryHandler.EndInvoke(asyncResult);
ISynchronizeInvoke async = this.dataGridView;
if (async.InvokeRequired)
{
async.Invoke(bindDataToGridInstance, new object[] { dsReponse });
}
}
}
*/
////======================2=========================////
AsyncResult originAsyncResult = asyncResult as AsyncResult;
if (originAsyncResult != null)
{
ExecQueryHandler execQuery = (ExecQueryHandler)originAsyncResult.AsyncDelegate;
DataSet dsReponse = execQuery.EndInvoke(asyncResult);
ISynchronizeInvoke async = this.dataGridView;
//InvokeRequired == false表示来自主线程;为true表示来自异步线程
if (dataGridView != null && bindDataToGridInstance != null)
{
if (async.InvokeRequired)
{
async.Invoke(bindDataToGridInstance, new object[] { dsReponse });
}
}
asyncResult.AsyncWaitHandle.Close();//显示的释放资源
}
}
public delegate void SendRequestHandler();
public SendRequestHandler sendRequestHandlerInstance = null;
public delegate void EndHandler();
public EndHandler endHandlerInstance = null;
static void DoAnotherJob()
{
Thread.Sleep(1000);//需要1秒才能完成这个工作
MessageBox.Show("[{0}]:Do Another Job", DateTime.Now.ToString());
}
}
}
代码
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace WinApp
{
public class AsyncReadWrite
{
//同步读文件
public static string SyncRead()
{
string path = @"d:\test.txt";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 20480, false);
StringBuilder sbReadResult = new StringBuilder();
using (fs)
{
byte[] data = new byte[1024];
int nbyteReads;
do
{
nbyteReads = fs.Read(data, 0, data.Length);
sbReadResult.Append(Encoding.Default.GetString(data, 0, nbyteReads));
} while (nbyteReads > 0);
//Console.WriteLine(sbReadResult.ToString());
}
//Console.ReadLine();
return sbReadResult.ToString().Trim();
}
//异步读文件
public static string AsyncRead()
{
string path = @"d:\Query.txt";
byte[] data = new byte[1024];
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 20480, true);
StringBuilder sbReadResult = new StringBuilder();
AsyncCallback asyncCallback = null;
//匿名方法
asyncCallback = delegate(IAsyncResult asyncResult)
{
int nRead = fs.EndRead(asyncResult);
sbReadResult.Append(Encoding.Default.GetString(data, 0, nRead));
if (nRead > 0)
{
fs.BeginRead(data, 0, 1024, asyncCallback, null);
}
else
{
fs.Close();//显示释放托管堆资源
}
};
IAsyncResult asyncReadResult = fs.BeginRead(data, 0, 1024, asyncCallback, null);
return sbReadResult.ToString().Trim();
}
//异步写文件
public static void AsyncWrite(string content)
{
string path = @"d:\write.txt";
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None, 20480, true);
byte[] data = Encoding.Default.GetBytes(content);
AsyncCallback asyncCallback = null;
asyncCallback = delegate(IAsyncResult async)
{
fs.EndWrite(async);
fs.Close();//显示释放托管堆资源
};
IAsyncResult asyncWriteResult = fs.BeginWrite(data, 0, data.Length, asyncCallback, null);
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace WinApp
{
public class AsyncReadWrite
{
//同步读文件
public static string SyncRead()
{
string path = @"d:\test.txt";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 20480, false);
StringBuilder sbReadResult = new StringBuilder();
using (fs)
{
byte[] data = new byte[1024];
int nbyteReads;
do
{
nbyteReads = fs.Read(data, 0, data.Length);
sbReadResult.Append(Encoding.Default.GetString(data, 0, nbyteReads));
} while (nbyteReads > 0);
//Console.WriteLine(sbReadResult.ToString());
}
//Console.ReadLine();
return sbReadResult.ToString().Trim();
}
//异步读文件
public static string AsyncRead()
{
string path = @"d:\Query.txt";
byte[] data = new byte[1024];
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 20480, true);
StringBuilder sbReadResult = new StringBuilder();
AsyncCallback asyncCallback = null;
//匿名方法
asyncCallback = delegate(IAsyncResult asyncResult)
{
int nRead = fs.EndRead(asyncResult);
sbReadResult.Append(Encoding.Default.GetString(data, 0, nRead));
if (nRead > 0)
{
fs.BeginRead(data, 0, 1024, asyncCallback, null);
}
else
{
fs.Close();//显示释放托管堆资源
}
};
IAsyncResult asyncReadResult = fs.BeginRead(data, 0, 1024, asyncCallback, null);
return sbReadResult.ToString().Trim();
}
//异步写文件
public static void AsyncWrite(string content)
{
string path = @"d:\write.txt";
FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None, 20480, true);
byte[] data = Encoding.Default.GetBytes(content);
AsyncCallback asyncCallback = null;
asyncCallback = delegate(IAsyncResult async)
{
fs.EndWrite(async);
fs.Close();//显示释放托管堆资源
};
IAsyncResult asyncWriteResult = fs.BeginWrite(data, 0, data.Length, asyncCallback, null);
Console.ReadLine();
}
}
}