繁体   English   中英

WCF 触发并忘记异常处理

[英]WCF Fire and forget exception handling

嗨,我想从现有的 WebAPI 服务中实现一个即发即弃的任务。 下面的代码只是将日志事件(可能是客户端已连接到服务以执行某些任务)发送到另一个服务,如果它失败,则不应向客户端返回错误。

我只是想记录并忘记异常,这意味着服务将继续执行原始任务。

我使用过 continuewith 并且想知道这是否是正确的方法。

        Task.Factory.StartNew(() =>
        {
            var client = (HttpWebRequest) WebRequest.Create(_url);

            client.Method = "POST";
            client.ContentType = "application/json";

            var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(log));

            var requestStream = client.GetRequestStream();

            requestStream.Write(bytes, 0, bytes.Length);

            requestStream.Close();

            var response = client.GetResponse();

            requestStream.Close();
            response.Close();

        }).ContinueWith((ca) =>
        {
            if (ca.Exception != null)
            {
                _logger.LogException(LogLevel.Error, ca.Exception.Message, ca.Exception);
            }

        }, TaskContinuationOptions.OnlyOnFaulted);

或者,我也认为我可以这样做,即不使用延续。

Task.Factory.StartNew(() =>
{
    try
    {
        var client = (HttpWebRequest) WebRequest.Create(_url);

        client.Method = "POST";
        client.ContentType = "application/json";

        var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(log));

        var requestStream = client.GetRequestStream();

        requestStream.Write(bytes, 0, bytes.Length);

        requestStream.Close();

        var response = client.GetResponse();

        requestStream.Close();
        response.Close();
    }
    catch(Exception e)
    {
        _logger.LogException(LogLevel.Error, e.message, e)
    }

})

提前致谢

在继续这样做:

if (ca.Exception != null)
{
    var ignoreTask = Task.Run(() => _logger.LogException(LogLevel.Error, ca.Exception.Message, ca.Exception));
}

您正在线程池线程上启动一个新任务,而不是等待该任务。 将 LogException 代码块放在 try catch 块中以忽略引发的任何异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM