繁体   English   中英

使用库(dll)处理任务的异常

[英]Exception handling with tasks using libraries (dll)

我有一个任务,该任务使用连接到WCF服务的数据访问库获取数据。 布局如下:

数据访问dll:

using (Service.ServiceClient client = new Service.ServiceClient(EndpointAddress))
{
    try
    {
        //Make my service call
        client.close()
        //return list
    }
    catch (FaultException fe)
    {
       client.Abort();
       throw fe;
    }
    catch (CommunicationException ce)
    {
        client.Abort();
        throw ce;
    }
    catch (TimeoutException te)
    {
        client.Abort();
        throw te;
    }
}

主程序:

Task<List<Stuff>> loadOp = new Task<List<Stuff>>(() => dataAccessDllMethod());
loadOp.Start();
try
{
    loadOp.ContinueWith((Sender) =>
    {
        Sender.Result
    }
catch (Exception ex)
{
    //Notify User
    throw;
}

现在,我的代码不断破坏loadOp的lambda表达式,这意味着用户永远不会收到通知,但是从我读到的内容来看,这是任务中错误处理的正确方法。 这是这样做的正确方法还是有更好的方法?

当启动一个Task时(如果是Task<List<Stuff>> ,您会立即带着承诺在将来某个时间完成的任务取回Task,并且您的方法会继续执行 ,这意味着它将完成try块并出口。 它不会阻止或等待Task完成。 您可以做几件事:

  1. 访问Task.Result属性,该属性在阻止线程的同时等待Task的结果。
  2. 调用Task.Wait() ,它等待Task完成也阻塞了线程。
  3. await Task ,它不会像前两个Task一样阻塞,而是将控制权交还给调用者,直到Task完成执行为止 为了做到这一点,编译器生成了一个状态机,该状态机为我们处理了所有事情。
  4. 正如Neel所建议的那样,添加一个继续项来处理先前的任务错误。 请注意,如果您尝试throw异常,除非有人访问传播完成它调用堆栈它不会工作ResultException持续的性质Task

我会做什么,而不是创建成功或失败不同的延续,只会await

Task<List<Stuff>> loadOp = Task.Run<List<Stuff>>(() => dataAccessDllMethod());
try
{
    Task<List<Stuff>> loadOp = await Task.Run<List<Stuff>>(() => dataAccessDllMethod());

    // do stuff with the result
}
catch (Exception ex)
{
    //Notify User
    throw;
}

最后一件事,建议的方法是在创建任务时始终使用Task.RunTask.Factory.Startnew ,因此您不小心忘记Start它们并返回一个永远不会执行的Cold Task (使用new Task

尝试下面的代码我想您不需要try catch,您可以直接编写如下所示的代码..:-

 loadOp.ContinueWith((Sender) =>
        {
            ////this will be called on successful completion
            Sender.Result
        }, TaskContinuationOptions.OnlyOnRanToCompletion);

      loadOp.ContinueWith((Sender) =>
    {
        ////Notify user
        ////This will be called when error occures
        Sender.Result
    }, TaskContinuationOptions.OnlyOnFaulted);

TaskContinuationOptions枚举的OnlyOnFaulted成员指示仅当先前任务引发异常时才应继续执行。

暂无
暂无

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

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