我有一些数据处理,这取决于有问题的方法的成功,该方法返回我处理中使用的结果。
外部方法存在问题,因为它运行缓慢,可能崩溃并抛出任何类型的异常,而且我没有源代码。
我想在处理开始时使用线程来节省一些时间,因为即使没有那个有问题的方法,我的处理也足够长。但是有一点我必须从有问题的方法得到一个有效的结果,如果它失败我就无法继续。
我希望在主线程中使用有问题的方法的异常,因此它们获得与我的处理可能抛出的任何其他异常相同的异常处理。
这是我的代码 - 它似乎没问题并且可行,但它对我来说看起来太麻烦了,所以我的问题是:是否有更好的方法来正确管理线程对有问题方法的调用,以及它的潜在异常?
我的环境是.NET 3.5,所以我想得到关注该版本的答案,但我还想了解是否有新的.NET版本的新方法。
非常感谢!
public void DoProcess()
{
object locker = new object();
bool problematicCodeFinished = false;
Exception methodException = null;
Result result;
Func<Result> getProblematicResult = new Func<Result>(() => problematicMethod()); //create delegate
//run problematic method it in thread
getProblematicResult.BeginInvoke((ar) => //callback
{
lock(locker)
{
try
{
result = getProblematicResult.EndInvoke();
}
catch (Exception ex)
{
methodException = ex;
}
finally
{
problematicCodeFinished = true;
Monitor.Pulse(locker);
}
}
}, null);
//do more processing in main thread
// ...
// ...
// ...
try
{
//here we must know what was the result of the problematic method
lock (locker)
{
if (!problematicCodeFinished) //wait for problematic method to finish
{
Monitor.Wait(locker);
}
}
//throw problematic method exception in main thread
if (methodException != null)
{
throw methodException;
}
//if we are here we can assume that we have a valid result, continue processing
// ...
// ...
// ...
}
catch (Exception ex) //for the problematic method exception, or any other exception
{
//normal exception handling for my processing
}
}
答案 0 :(得分:0)
你为自己的生活变得艰难。尝试使用TPL中的任务。
您的代码如下所示:
public void DoProcess()
{
var task = Task.Factory.StartNew(() => problematicMethod());
//do more processing in main thread
// ...
// ...
// ...
var result = task.Result;
}