将事件转换为任务的可重用模式

将事件转换为任务的可重用模式,第1张

将事件转换为任务的可重用模式

可以使用帮助器类和流利的语法:

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);


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5440748.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-11
下一篇2022-12-11

发表评论

登录后才能评论

评论列表(0条)

    保存