【发布时间】:2020-08-02 22:04:57
【问题描述】:
我有一个从 Firebase 获取一些值的方法,如下所示:
void getTable(Action<IDictionary> callBack)
{
// function & data initialized here
function.CallAsync(data).ContinueWith((callTask) =>
{
if (callTask.IsFaulted)
callBack(null);
else if (callTask.IsCompleted)
{
Debug.Log("I am being executed when done");
var result = (IDictionary) callTask.Result.Data;
callBack(result);
}
});
}
我从另一个方法调用此方法,如下所示:
public void GetTable(ref string valueReturned)
{
string val = null;
getTable((dictionary =>
{
Debug.Log("Done getting values");
val = (string) dictionary["someValue"]; // returns "testValue" to val
}));
valueReturned = val;
Debug.Log("Value is:" + valueReturned);
Debug.Log("Completed Execution");
}
预期输出:
- 完成后我将被处决
- 完成获取值
- 值为:testValue
- 已完成执行
我得到的输出是:
- 完成后我将被处决
- 值为:(null)
- 已完成执行
- 完成获取值
我尝试在 GetTable 方法的 lambda 表达式中分配“valueReturned”。但它给出了错误:“无法在 lambda 表达式中引用用户引用参数”
【问题讨论】:
-
您的
function.CallAsync(data).ContinueWith没有等待,这就是为什么您在“完成获取价值”之前获得“完成执行”的原因。正如@Miral 提到的:将异步方法转换为回调是没有意义的。
标签: c# unity3d asynchronous task