当前位置: 首页 > 编程语言 > C#

TimeoutusingTaskCompletionSource实现异步方法分享

时间:2023-04-10 19:19:57 C#

timeoutusingTaskCompletionSource实现异步方法我有一个黑盒对象,它暴露了一个异步操作方法,并在操作完成时触发一个事件。我使用TaskCompletionSource将其包装到TaskBlackBoxOperationAysnc()方法中-效果很好。但是,在该异步包装器中,如果在给定超时后未收到任何事件,我想设法完成带有超时错误的异步调用。目前我用计时器管理它:publicTaskBlackBoxOperationAysnc(){vartcs=newTaskCompletionSource();constinttimeoutMs=20000;计时器timer=newTimer(_=>tcs.TrySetResult(OpResult.Timeout),null,timeoutMs,Timeout.Infinite);EventHandlereventHandler=(sender,args)=>{...tcs.TrySetResult(OpResult.BlarBlar);}blackBox.EndAsyncOpEvent+=eventHandler;blackBox.StartAsyncOp();返回tcs.Task;管理超时的唯一方法?有没有办法设置我自己的计时器-我没有看到TaskCompletionSource内置任何超时?您可以使用CancellationTokenSource来超时。像这样将它与TaskCompletionSource一起使用。例如:publicTaskBlackBoxOperationAysnc(){vartcs=newTaskCompletionSource();constinttimeoutMs=20000;varct=newCancellationTokenSource(timeoutMs);ct.Token.Register(()=>tcs.TrySetCanceled(),useSynchronizationContext:false);EventHandlereventHandler=(sender,args)=>{...tcs.TrySetResult(OpResult.BlarBlar);}blackBox.EndAsyncOpEvent+=eventHandler;blackBox.StartAsyncOp();返回tcs.Task;}更新了,这是一个完整的函数示例:usingSystem;使用System.ComponentModel;使用系统线程;使用System.Threading.Tasks;namespaceConsoleApplication{publicclassProgram{//.NET4.5/C#5.0:使用超时将EAP模式转换为TAP模式;//准备超时CancellationTokennewToken;if(timeout!=Timeout.Infinite){varcts=CancellationTokenSource.CreateLinkedTokenSo资源(令牌);cts.CancelAfter(超时);newToken=cts.Token;}elsenewToken=token;//处理完成AsyncCompletedEventHandlerhandler=(sender,args)=>{if(args.Cancelled)tcs.TrySetCanceled();elseif(args.Error!=null)tcs.SetException(args.Error);否则tcs.SetResult(args);};this.BlackBoxOperationCompleted+=处理程序;尝试{使用(newToken.Register(()=>tcs.SetCanceled(),useSynchronizationContext:false)){this.StartBlackBoxOperation(null);返回等待tcs.Task.ConfigureAwait(continueOnCapturedContext:false);}}最后{this.BlackBoxOperationCompleted-=handler;}}//模拟异步操作AsyncCompletedEventHandlerBlackBoxOperationCompleted=delegate{};voidStartBlackBoxOperation(objectstate){ThreadPool.QueueUserWorkItem(s=>{Thread.Sleep(1000);this.BlackBoxOperationCompleted(this,newAsyncCompletedEventArgs(error:null,cancelled:false,userState:state));},state);}//测试staticvoidMain(){尝试{newProgram().BlackBoxOperationAsync(null,CancellationToken.None,1200).Wait();Console.WriteLine("完成。");newProgram().BlackBoxOperationAsync(null,CancellationToken.None,900).Wait();}catch(Exceptionex){while(exisAggregateException)ex=ex.InnerException;Console.WriteLine(ex.Message);}控制台.ReadLine();可以在这里找到.NET4.0/C#Version4.0,它使用编译器生成的IEnumerator状态机。以上就是C#学习教程:超时使用TaskCompletionSource实现的异步方法,分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多分享注意——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: