C#从回调函数返回异步参数

时间:2015-12-14 17:22:57

标签: c# multithreading parameters

我对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。

返回这样的值的最佳方法是什么?

2 个答案:

答案 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
}

...解决它。评论

编辑:意识到这只是一个通行证。真正的代码会对结果产生影响。