Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用任务处理异常_C#_.net_Parallel Processing_Task - Fatal编程技术网

C# 使用任务处理异常

C# 使用任务处理异常,c#,.net,parallel-processing,task,C#,.net,Parallel Processing,Task,假设我有这样的代码: serviceCallFinished = false; Task.Factory.StartNew(() => { response = ServiceManager.GeneralService.ServiceMethod(loginName, password); }).ContinueWith(parentTask => { serviceCallFinished = true; }); while (!serviceCallFinished)

假设我有这样的代码:

serviceCallFinished = false;
Task.Factory.StartNew(() => {
    response = ServiceManager.GeneralService.ServiceMethod(loginName, password);
}).ContinueWith(parentTask => { serviceCallFinished = true; });

while (!serviceCallFinished)
    Thread.Sleep(100);

if (response.UserValid) { }
Task.Factory.StartNew(() => 
  {
   response = ServiceManager.GeneralService.ServiceMethod(
     loginName, password);
  })
  .ContinueWith(parentTask => { if (response.UserValid) { } });
在这种情况下,
ServiceMethod
将抛出一个
异常
,但它从未显示,相反,我将在
响应上得到一个空引用。UserValid

为什么异常没有交给我的UI线程

注意:这是在UI线程上,我的想法是在servicecall期间不要阻塞线程。

查看 还有一个很好的例子

你可以做的基本上是用以下方法来取代你的睡眠循环:

try
{
    task.Wait();
}
catch (AggregateException ae)
{
  ...
}

您不需要使用这样的标志来等待异步任务完成。使用Wait()


Wait()调用将提升整个AggregateException中的所有异常。

从注释中可以看出,与所发布的示例相反,您似乎希望在等待响应时返回调用方的逻辑,然后再执行一系列操作。这听起来也像是后来的东西包含了很多非常复杂的方法,你想按程序编写。C#团队已经听到了您的问题,许多人都喜欢它,并开发了异步/等待框架,将完全做到这一点,预定用于C#5。或者,如果它是您的一个选项,那么这里有一个AsyncCTP:HTH。

为什么不这样编写代码:

serviceCallFinished = false;
Task.Factory.StartNew(() => {
    response = ServiceManager.GeneralService.ServiceMethod(loginName, password);
}).ContinueWith(parentTask => { serviceCallFinished = true; });

while (!serviceCallFinished)
    Thread.Sleep(100);

if (response.UserValid) { }
Task.Factory.StartNew(() => 
  {
   response = ServiceManager.GeneralService.ServiceMethod(
     loginName, password);
  })
  .ContinueWith(parentTask => { if (response.UserValid) { } });

它似乎更清晰、更具响应性。

它不会回答您的问题,但请删除该循环,等待完成。使用其他工具(manualResetEvent)这里的主线程是一个UI线程,它不能被阻止,这就是我使用Tread.Sleep的原因。我也不想为了能够将线程发送到特定的方法而将方法拆分。如果循环的目的是非阻塞,那么您肯定错了:UI线程在执行睡眠时被阻塞。好的,所以解决这一问题的唯一方法是拆分方法,然后继续将线程传递到方法的第二部分(method2)?这将有很多方法,并且代码会很复杂。Joe reply是一个用于正确等待和异常管理的方法。如所述,是的。Wait有许多重载,它们使用时间参数(int毫秒或TimeSpan)如果任务在等待周期内未完成,则返回true或false。