C#从回调函数返回异步参数
我对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成员设置为空。
什么是返回一个像这样的价值的最好方法是什么?
您已经声明回调的范围内的“数据”变量。回调在大多数情况下不会在它们被调用的同一个线程中调用(在很多平台中,不仅仅是.NET),所以CLR可能无法保证本地内部“回调”的价值。
你可以做什么,只要你可以改变回调的签名,是使其静态的,因此对于数据变量 - 也是静态的。一个很好的例子可以在MSDN的以下链接中找到: https://msdn.microsoft.com/en-us/library/bbx2eya8(v=vs.110).aspx
您不需要阅读整篇文章 - 只需滚动到底部 - 请参阅名为“private static void ReceiveCallback(IAsyncResult ar)“并引用其中的变量”receiveDone“,假定它是静态的。
使用全局变量看起来不太优雅。我用它作为“占位符”。此外,它可能会产生额外的问题,我仍然不确定这件事上的访问模式是什么。应该有一种方法来发送某种安全指针......“将数据放在这里”。对? – user1032861
将对象列表传递给回调函数,并将创建的数组添加到该列表中。但是应该有一个特定的课程,不是吗? – user1032861
您可以在此命名空间上找到容器类: System.Collections.Generic例如列表,队列,词典等。 –
我认为像...
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。真正的代码对结果做了些什么。
你写的程序,但没有给我们实际可用的代码。 –
我想要在MakeRequest上使用的参数。这应该是我认为足够的代码。 – user1032861