C# - 使用线程获取有问题的方法结果

时间:2014-11-23 11:01:13

标签: c# multithreading

我有一些数据处理,这取决于有问题的方法的成功,该方法返回我处理中使用的结果。

外部方法存在问题,因为它运行缓慢,可能崩溃并抛出任何类型的异常,而且我没有源代码。

我想在处理开始时使用线程来节省一些时间,因为即使没有那个有问题的方法,我的处理也足够长。但是有一点我必须从有问题的方法得到一个有效的结果,如果它失败我就无法继续。

我希望在主线程中使用有问题的方法的异常,因此它们获得与我的处理可能抛出的任何其他异常相同的异常处理。

这是我的代码 - 它似乎没问题并且可行,但它对我来说看起来太麻烦了,所以我的问题是:是否有更好的方法来正确管理线程对有问题方法的调用,以及它的潜在异常?

我的环境是.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
    }
}

1 个答案:

答案 0 :(得分:0)

你为自己的生活变得艰难。尝试使用TPL中的任务。

您的代码如下所示:

public void DoProcess()
{
    var task = Task.Factory.StartNew(() => problematicMethod());

    //do more processing in main thread
    //    ...
    //    ...
    //    ...

    var result = task.Result;
}