将lambda中的值返回到全局方法C#

时间:2017-02-15 13:35:38

标签: c# asynchronous lambda

我有一个带有两个回调的方法。一个用于错误,一个用于成功。 目前它看起来像这样:

private resultObject makeMyRequest()
{
    requestObject request = new requestObject();

    MakeRequest(request, (result) =>
    {
        return result;
    }, (error) => {
        return null;

    });
}

这里的问题是两个返回语句。他们试图返回lambda表达式。但我希望他们做的是回到" makeMyRequest"方法。如何才能做到这一点?更重要的是,如果它完成了。这将是一个非常缓慢的方法。有没有办法做到这一点" async"或类似的。我目前在.NET 2.0环境中工作,因此我无法访问一些较新的异步技术。

1 个答案:

答案 0 :(得分:2)

我猜你需要这样的东西:

private resultObject makeMyRequest()
{
    requestObject request = new requestObject();

    resultObject returnValue = null

    MakeRequest(request, 
        (result) =>  { returnValue = result; },
        (error) => { });

    return returnValue;
}

(仅当MakeRequest(...)同步时才有效。)

如果MakeRequest是异步的话,这应该可以解决问题:

private resultObject makeMyRequest()
{
    requestObject request = new requestObject();

    AutoResetEvent autoEvent = new AutoResetEvent(false); 
    resultObject returnValue = null

    MakeRequest(request, 
        (result) =>  { 
            returnValue = result; 
            autoEvent.Set(); 
        },
        (error) => { 
            autoEvent.Set();
        });

    autoEvent.WaitOne();

    return returnValue;
}

备注:如果您不希望线程被阻止,您可以返回包含自动重置事件和结果的自定义对象,以便稍后等待。

完整的例子

private async resultObject makeMyRequest()
{
    requestObject request = new requestObject();

    var returnValue = new PromiseResult(new AutoResetEvent(false));         

    MakeRequest(request, 
        (result) =>  { 
            returnValue.Result = result; 
            returnValue.Event.Set(); 
        },
        (error) => { 
            returnValue.Event.Set();
        });


    return returnValue;
}


public class PromiseResult {
    public resultObject Result {get;set;}
    public AutoResetEvent Event {get;}

    public PromiseResult(AutoResetEvent are){
        Event = are;
    }       
}

public class Example{

    public void Test(){

        var promise = makeMyRequest();

        while(true){

            if (promise.Event.WaitOne(0)){
                Console.WriteLine(promise.Result);
                return;
            }
            else
            {
                Console.WriteLine("Not ready yet ..., but the thread is free to do some other stuff");
                System.Threading.Thread.CurrentThread.Sleep(500);
            }
        }           
    }
}