2015-12-14 150 views
0

我对C#比较陌生。我有一些麻烦从回调中返回值。 我有一个像结构: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有正确的值,但是(我得到一个信号,数据已准备就绪)无论我通过槽“参数”回调有xxx成员设置为空。

什么是返回一个像这样的价值的最好方法是什么?

+1

你写的程序,但没有给我们实际可用的代码。 –

+0

我想要在MakeRequest上使用的参数。这应该是我认为足够的代码。 – user1032861

回答

1

您已经声明回调的范围内的“数据”变量。回调在大多数情况下不会在它们被调用的同一个线程中调用(在很多平台中,不仅仅是.NET),所以CLR可能无法保证本地内部“回调”的价值。

你可以做什么,只要你可以改变回调的签名,是使其静态的,因此对于数据变量 - 也是静态的。一个很好的例子可以在MSDN的以下链接中找到: https://msdn.microsoft.com/en-us/library/bbx2eya8(v=vs.110).aspx

您不需要阅读整篇文章 - 只需滚动到底部 - 请参阅名为“private static void ReceiveCallback(IAsyncResult ar)“并引用其中的变量”receiveDone“,假定它是静态的。

+0

使用全局变量看起来不太优雅。我用它作为“占位符”。此外,它可能会产生额外的问题,我仍然不确定这件事上的访问模式是什么。应该有一种方法来发送某种安全指针......“将数据放在这里”。对? – user1032861

+0

将对象列表传递给回调函数,并将创建的数组添加到该列表中。但是应该有一个特定的课程,不是吗? – user1032861

+0

您可以在此命名空间上找到容器类: System.Collections.Generic例如列表,队列,词典等。 –

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 
} 

...解决它。注释?

编辑:意识到,这只是一个passtrough。真正的代码对结果做了些什么。