C# 从lambda向全局方法C返回一个值#

C# 从lambda向全局方法C返回一个值#,c#,asynchronous,lambda,C#,Asynchronous,Lambda,我有一个有两个回调的方法。一个是错误,一个是成功。 现在看起来是这样的: private resultObject makeMyRequest() { requestObject request = new requestObject(); MakeRequest(request, (result) => { return result; }, (error) => { return null; }); }

我有一个有两个回调的方法。一个是错误,一个是成功。 现在看起来是这样的:

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

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

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

    resultObject returnValue = null

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

    return returnValue;
}

这里的问题在于两个返回语句。他们试图返回lambda表达式。但我希望他们做的是返回到“makeMyRequest”方法。如何做到这一点?如果成功了,情况会更糟。这将是一个非常缓慢的方法。有没有一种方法可以做到“异步”或类似的方式。我目前在.NET 2.0环境中工作,因此无法使用某些较新的异步技术。

我想您需要这样的技术:

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

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

    });
}
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);
            }
        }           
    }
}

MakeRequest()
返回什么?什么是
MakeRequest
的签名?@haim770嗯,这是一种可能失败或成功的方法。这是一个网络请求。如果失败,它只返回一个错误对象。但是我不介意在这种情况下,我只想返回null,就像上面的例子一样。但如果成功,它将返回一个“resultObject”,就像全局方法一样,“回调”意味着它是一个异步操作。你到底想从中“返回”什么?在回调发生之前,封闭方法不是已经完成了吗?@David哦,对不起,是的。它是异步的。但是我试图返回类型为“resultObject”的“result”变量。这就是我需要的。(底部版本)。你介意给我看一个非线程阻塞版本的例子吗?对象中会有什么,等等,因为我不能使用多个线程,也不能为我工作的环境阻止主线程。谢谢,谢谢,只有一个问题。正如我在原始问题中所述,我正在使用.NET2.0。我从类中得到了以下错误:“功能‘readonly automatically implemented properties’在C#4中不可用。请使用语言版本6或更高版本。我认为这是行
public AutoResetEvent事件{get;}”
只需添加
集合;
就可以解决这个问题。哦,是的,这解决了那部分问题。现在转到实际的方法。“功能‘异步功能’在C#4中不可用。请使用语言版本5或更高版本”。我不理解此错误,但I.NET framework和C#语言版本是两码事。您可以升级Visual Studio以使用最新的C#语言版本。这完全不会影响您的解决方案(/build)