您的位置:首页 > 编程语言 > C#

c#中的多线程异常

2015-12-18 15:50 393 查看
1.对于Thread操作的异常处理

public static void Main()
{
try
{

  Thread th = new Thread(DoWork);
th.Start();
}
catch (Exception ex)
{
// Non-reachable code
Console.WriteLine ("Exception!");
}
}
static void DoWork()

{

  ……

   throw null;  // Throws a NullReferenceException

}

在DoWork函数里抛出的异常时不会被主线程的try,catch捕捉的,各个线程应该有自己的try,catch去处理线程异常。

正确写法:

public static void Main()
{
Thread th = new Thread(DoWork);
th.Start();
}
static void DoWork()
{
try
{
……
throw null; // The NullReferenceException will be caught below
}
catch (Exception ex)
{
Typically log the exception, and/or signal another thread
that we've come unstuck
...
}

}

2. 异步函数的异常处理

例如如 WebClient中的 UploadStringAsync,它的异常会在UploadStringCompleted的参数error里

static void Main(string[] args)
{
WebClient webClient = new WebClient();
webClient.UploadStringCompleted += new UploadStringCompletedEventHandler((sender, e) =>
{
if (e.Error != null)
{
Console.WriteLine(e.Error.Message);
}
});
webClient.UploadStringAsync(new Uri("http://www.baidu.com"), "1111");
Console.ReadKey();
}

3 Task的异常处理

把try包含task.wait()函数,就能捕捉task的异常

Task task = Task.Run (() => { throw null; });
try
{
task.Wait();
}
catch (AggregateException aex)
{
if (aex.InnerException is NullReferenceException)
Console.WriteLine ("Null!");
else
throw;
}

或者 在continue函数里处理TaskContinuationOptions.OnlyOnFaulted的状态

Task<List<int>> taskWithFactoryAndState =
Task.Factory.StartNew<List<int>>((stateObj) =>
{
List<int> ints = new List<int>();
for (int i = 0; i < (int)stateObj; i++)
{
ints.Add(i);
if (i > 100)
{
InvalidOperationException ex =
new InvalidOperationException("oh no its > 100");
ex.Source = "taskWithFactoryAndState";
throw ex;
}
}
return ints;
}, 2000);

//and setup a continuation for it only on when faulted
taskWithFactoryAndState.ContinueWith((ant) =>
{
AggregateException aggEx = ant.Exception;
Console.WriteLine("OOOOPS : The Task exited with Exception(s)");
   foreach (Exception ex in aggEx.InnerExceptions)
{
Console.WriteLine(string.Format("Caught exception '{0}'",
ex.Message));
}
}, TaskContinuationOptions.OnlyOnFaulted);

//and setup a continuation for it only on ran to completion
taskWithFactoryAndState.ContinueWith((ant) =>
{
List<int> result = ant.Result;
foreach (int resultValue in result)
{
Console.WriteLine("Task produced {0}", resultValue);
}
}, TaskContinuationOptions.OnlyOnRanToCompletion);
Console.ReadLine();

4 c# 5.0 中的async ,await 异常捕捉

static async Task ThrowAfter(int timeout, Exception ex)
{
  await Task.Delay(timeout);
  throw ex;
}

static async Task MissHandling()
{
  var t1 = ThrowAfter(1000, new NotSupportedException("Error 1"));

  try
  {
    await t1;
  }
  catch (NotSupportedException ex)
  {
    Console.WriteLine(ex.Message);
  }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: