
可以使用帮助器类和流利的语法:
public static class TaskExt{ public static EAPTask<TEventArgs, EventHandler<TEventArgs>> FromEvent<TEventArgs>() { var tcs = new TaskCompletionSource<TEventArgs>(); var handler = new EventHandler<TEventArgs>((s, e) => tcs.TrySetResult(e)); return new EAPTask<TEventArgs, EventHandler<TEventArgs>>(tcs, handler); }}public sealed class EAPTask<TEventArgs, TEventHandler> where TEventHandler : class{ private readonly TaskCompletionSource<TEventArgs> _completionSource; private readonly TEventHandler _eventHandler; public EAPTask( TaskCompletionSource<TEventArgs> completionSource, TEventHandler eventHandler) { _completionSource = completionSource; _eventHandler = eventHandler; } public EAPTask<TEventArgs, TOtherEventHandler> WithHandlerConversion<TOtherEventHandler>( Converter<TEventHandler, TOtherEventHandler> converter) where TOtherEventHandler : class { return new EAPTask<TEventArgs, TOtherEventHandler>( _completionSource, converter(_eventHandler)); } public async Task<TEventArgs> Start( Action<TEventHandler> subscribe, Action action, Action<TEventHandler> unsubscribe, CancellationToken cancellationToken) { subscribe(_eventHandler); try { using(cancellationToken.Register(() => _completionSource.SetCanceled())) { action(); return await _completionSource.Task; } } finally { unsubscribe(_eventHandler); } }}现在,您有了一个
WithHandlerConversion辅助方法,该方法可以从转换器参数中推断类型参数,这意味着您
WebBrowserdocumentCompletedEventHandler只需要编写一次即可。用法:
await TaskExt .FromEvent<WebBrowserdocumentCompletedEventArgs>() .WithHandlerConversion(handler => new WebBrowserdocumentCompletedEventHandler(handler)) .Start( handler => this.webBrowser.documentCompleted += handler, () => this.webBrowser.Navigate(@"about:blank"), handler => this.webBrowser.documentCompleted -= handler, CancellationToken.None);
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)