【问题标题】:SelfHost DelegatingHandlerSelfHost DelegatingHandler
【发布时间】:2016-11-06 22:58:56
【问题描述】:

我已经创建了自定义委托处理程序并覆盖了它的方法

Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)

现在在那个方法中我运行自定义同步方法,你们能告诉我这个例子哪个是正确的,或者如果两个都不正确,让我知道更好的用法,以避免任何死锁

1.

 protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (Processor.CanProcess(request))
        {
            var tsc = new TaskCompletionSource<HttpResponseMessage>(cancellationToken);
            tsc.SetResult(Processor.Process(request));
            return tsc.Task;
        }
        return base.SendAsync(request, cancellationToken);
    }

2.

 protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (Processor.CanProcess(request))
            return Task.Run(() => Processor.Process(request), cancellationToken);
        return base.SendAsync(request, cancellationToken);
    }

我应该使用异步等待还是最好保持原样。

【问题讨论】:

  • Processor.Process 每秒运行的频率是多少?如果不经常,那么你做什么都没关系,你可以选择最方便的形式。
  • 在最坏的情况下它可以每60ms运行一次,它可以同时接收16个请求

标签: c# deadlock delegatinghandler


【解决方案1】:

Processor.Process 每秒运行的频率是多少?如果不经常,那么无论您做什么都没关系,您可以选择最方便的形式。

在最坏的情况下它可以每 60 毫秒运行一次,它可以同时接收 16 个请求

这没什么。我会无所谓的。此外,由于您没有可用的异步 API,因此您无能为力。

选择最方便的形式。我喜欢这个:

return Task.FromResult(Processor.Process(request));

取消标记在此处没有任何作用,因此请忽略它。没有Processor的合作,没有取消。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2015-10-17
    相关资源
    最近更新 更多