我对C#比较陌生。我有一些麻烦从回调中返回值。 我有一个像这样的结构:
struct Params
{
...
XXX[] xxx;
}
和一个回调函数,只要有一些XXX数据准备好就会被调用:
void Callback(object response, object param)
{
var data = (Params)param;
data.xxx = (XXX[])response;
// signal
}
使用方法如下:
Param param = new Param();
...
MakeRequest(Callback, param);
...
内部回调data.xxx具有正确的值,但是(在我得到数据已准备好的信号之后)无论我通过“param”传递给Callback都将xxx成员设置为null。
返回这样的值的最佳方法是什么?
答案 0 :(得分:1)
您已在回调范围内声明了“数据”变量。在大多数情况下,回调函数不会在调用它们的同一个线程中调用(在许多平台上,而不仅仅是.NET),因此CLR可能无法保证本地内部“回调”的值。
如果你可以改变回调的签名,你可以做的是使它变为静态,对数据变量也是如此 - 也是静态的。可以在以下链接的MSDN上找到一个很好的示例: https://msdn.microsoft.com/en-us/library/bbx2eya8(v=vs.110).aspx
你不需要阅读整篇文章 - 只需向下滚动 - 看到一个名为“private static void ReceiveCallback(IAsyncResult ar)”的回调,并在其中引用变量“receiveDone”,其中被认为是静态的。
答案 1 :(得分:0)
我想像......
class Container
{
public object container;
}
struct Params
{
...
Container xxx;
}
Params params = new Params();
params.xxx = new Container();
void Callback(object response, object param)
{
var data = (Params)param;
data.xxx.container = (XXX[])response;
// signal
}
...解决它。评论
编辑:意识到这只是一个通行证。真正的代码会对结果产生影响。