MSDN异步编程概述 C#bitman的专栏博客园Word文档下载推荐.docx
- 文档编号:18343519
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:6
- 大小:16.70KB
MSDN异步编程概述 C#bitman的专栏博客园Word文档下载推荐.docx
《MSDN异步编程概述 C#bitman的专栏博客园Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《MSDN异步编程概述 C#bitman的专栏博客园Word文档下载推荐.docx(6页珍藏版)》请在冰豆网上搜索。
如果异步调用未完成,EndInvoke将一直阻塞到异步调用完成。
EndInvoke的参数包括您需要异步执行的方法的out和ref参数(在VisualBasic中为&
lt;
Out&
gt;
ByRef和ByRef)以及由BeginInvoke返回的IAsyncResult。
注意VisualStudio.NET中的智能感知功能会显示BeginInvoke和EndInvoke的参数。
如果您没有使用VisualStudio或类似的工具,或者您使用的是C#和VisualStudio.NET,请参见异步方法签名获取有关运行库为这些方法定义的参数的描述。
本主题中的代码演示了四种使用BeginInvoke和EndInvoke进行异步调用的常用方法。
调用了BeginInvoke后,可以:
&
#183;
进行某些操作,然后调用EndInvoke一直阻塞到调用完成。
使用IAsyncResult.AsyncWaitHandle获取WaitHandle,使用它的WaitOne方法将执行一直阻塞到发出WaitHandle信号,然后调用EndInvoke。
轮询由BeginInvoke返回的IAsyncResult,确定异步调用何时完成,然后调用EndInvoke。
将用于回调方法的委托传递给BeginInvoke。
该方法在异步调用完成后在ThreadPool线程上执行,它可以调用EndInvoke。
警告始终在异步调用完成后调用EndInvoke。
测试方法和异步委托
四个示例全部使用同一个长期运行的测试方法TestMethod。
该方法显示一个表明它已开始处理的控制台信息,休眠几秒钟,然后结束。
TestMethod有一个out参数(在VisualBasic中为&
ByRef),它演示了如何将这些参数添加到BeginInvoke和EndInvoke的签名中。
您可以用类似的方式处理ref参数(在VisualBasic中为ByRef)。
下面的代码示例显示TestMethod以及代表TestMethod的委托;
若要使用任一示例,请将示例代码追加到这段代码中。
注意为了简化这些示例,TestMethod在独立于Main()的类中声明。
或者,TestMethod可以是包含Main()的同一类中的static方法(在VisualBasic中为Shared)。
usingSystem;
usingSystem.Threading;
publicclassAsyncDemo{
//Themethodtobeexecutedasynchronously.
//
publicstringTestMethod(intcallDuration,outintthreadId){
Console.WriteLine("
Testmethodbegins."
);
Thread.Sleep(callDuration);
threadId=AppDomain.GetCurrentThreadId();
return"
MyCallTimewas"
+callDuration.ToString();
}
}//Thedelegatemusthavethesamesignatureasthemethod
//youwanttocallasynchronously.
publicdelegatestringAsyncDelegate(intcallDuration,outintthreadId);
#160;
使用EndInvoke等待异步调用
异步执行方法的最简单方式是以BeginInvoke开始,对主线程执行一些操作,然后调用EndInvoke。
EndInvoke直到异步调用完成后才返回。
这种技术非常适合文件或网络操作,但是由于它阻塞EndInvoke,所以不要从用户界面的服务线程中使用它。
publicclassAsyncMain{
staticvoidMain(string[]args){
//Theasynchronousmethodputsthethreadidhere.
intthreadId;
//Createaninstanceofthetestclass.
AsyncDemoad=newAsyncDemo();
//Createthedelegate.
AsyncDelegatedlgt=newAsyncDelegate(ad.TestMethod);
//Initiatetheasychronouscall.
IAsyncResultar=dlgt.BeginInvoke(3000,
outthreadId,null,null);
Thread.Sleep(0);
Mainthread{0}doessomework."
AppDomain.GetCurrentThreadId());
//CallEndInvoketoWaitfortheasynchronouscalltocomplete,
//andtoretrievetheresults.
stringret=dlgt.EndInvoke(outthreadId,ar);
Thecallexecutedonthread{0},withreturnvalue\"
{1}\"
."
threadId,ret);
}
使用WaitHandle等待异步调用
等待WaitHandle是一项常用的线程同步技术。
您可以使用由BeginInvoke返回的IAsyncResult的AsyncWaitHandle属性来获取WaitHandle。
异步调用完成时会发出WaitHandle信号,而您可以通过调用它的WaitOne等待它。
如果您使用WaitHandle,则在异步调用完成之后,但在通过调用EndInvoke检索结果之前,可以执行其他处理。
//WaitfortheWaitHandletobecomesignaled.
ar.AsyncWaitHandle.WaitOne();
//Performadditionalprocessinghere.
//CallEndInvoketoretrievetheresults.
轮询异步调用完成
您可以使用由BeginInvoke返回的IAsyncResult的IsCompleted属性来发现异步调用何时完成。
从用户界面的服务线程中进行异步调用时可以执行此操作。
轮询完成允许用户界面线程继续处理用户输入。
//Pollwhilesimulatingwork.
while(ar.IsCompleted==false){
Thread.Sleep(10);
}//CallEndInvoketoretrievetheresults.
异步调用完成时执行回调方法
如果启动异步调用的线程不需要处理调用结果,则可以在调用完成时执行回调方法。
回调方法在ThreadPool线程上执行。
要使用回调方法,必须将代表该方法的AsyncCallback委托传递给BeginInvoke。
也可以传递包含回调方法将要使用的信息的对象。
例如,可以传递启动调用时曾使用的委托,以便回调方法能够调用EndInvoke。
//Asynchronousmethodputsthethreadidhere.
privatestaticintthreadId;
//Initiatetheasychronouscall.IncludeanAsyncCallback
//delegaterepresentingthecallbackmethod,andthedata
//neededtocallEndInvoke.
IAsyncResultar=dlgt.BeginInvoke(3000,
outthreadId,
newAsyncCallback(CallbackMethod),
dlgt);
PressEntertocloseapplication."
Console.ReadLine();
//Callbackmethodmusthavethesamesignatureasthe
//AsyncCallbackdelegate.
staticvoidCallbackMethod(IAsyncResultar){
//Retrievethedelegate.
AsyncDelegatedlgt=(AsyncDelegate)ar.AsyncState;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MSDN异步编程概述 C# bitman的专栏 博客园 MSDN 异步 编程 概述 bitman 专栏 博客