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)