WCF启动并忘记异常处理



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

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

我用过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块中,以忽略引发的任何异常。

最新更新