AsyncCallBack - 它必须是静态的/它是不是必须返回 void?

Posted

技术标签:

【中文标题】AsyncCallBack - 它必须是静态的/它是不是必须返回 void?【英文标题】:AsyncCallBack - Does it have to be static / Does it have to return void?AsyncCallBack - 它必须是静态的/它是否必须返回 void? 【发布时间】:2012-09-01 14:34:04 【问题描述】:

我的问题相当简单,但我怀疑答案不会。在我的 WP7 应用程序中,我正在调用 REST Web 服务来获取一些我反序列化为类对象的数据。

我的请求方法及其 AsyncCallBack 方法存在于类(MVVM ViewModel)中,并从类的实例方法(LoadData)中调用。

AsyncCallBack 将从 Web 服务检索到的 json 反序列化为一个对象。我需要将此对象添加到所有这一切发生的类的集合中 - 就像这样:

this.Collection1.Add(retrievedObject); 

当然,由于 AsyncCallBack 是静态的,我无法访问“this”关键字。我也无法将检索到的对象返回给调用者,因为 AsyncCallBack 必须返回 void。我意识到我可能是这里一些基本误解的受害者。我该如何解决这个问题?

谢谢!

【问题讨论】:

为什么你的AsyncCallback 必须是静态的? 它没有;但我注意到它总是在示例中。我担心将其设为非静态会使其成为非线程安全的或类似的东西。正如我所说,我对这些方法不是很熟悉......但如果不是问题,请告诉我,因为这会回答我的问题!通过简单地将 AsyncCallBack 设为实例方法并在 AsyncCallBack 中执行 this.Collection1.Add(retrievedObject),我会收到“无效的跨线程访问”异常。 您的回调可能会在非 UI 线程上调用,因此您可能需要同步对您的集合的访问(或使用线程安全的集合),但您的回调不需要一个静态方法。 您不能从除主线程(即创建控件的线程)之外的任何其他线程访问任何控件。您需要使用Dispatcher 在主线程中运行该代码。见:***.com/questions/6238064/… 谢谢你们!一旦你指出了主要问题,我在@SteveWillcock 的回答中找到了这个很好的解决方案:***.com/questions/3420282/… 【参考方案1】:

它必须是静态的吗?没有。

回调不必是静态的,但您应该关注线程安全。回调方法将在不同的线程上调用,因此如果它使用了一些主线程也在使用的数据,则必须同步对该数据的访问。

它必须返回无效吗?是的。

回调方法不能向启动异步任务的方法返回任何内容,因为该方法在任务完成之前返回。对于设置该返回值的回调方法,它必须及时返回。

【讨论】:

太棒了-谢谢!这是(在我看来)处理线程的好方法:Steve Willcock 在这个线程上的回答:***.com/questions/3420282/…【参考方案2】:

阅读如何使用异步编程模式 (APM):msdn.microsoft.com/en-us/library/ms228963.aspx

【讨论】:

以上是关于AsyncCallBack - 它必须是静态的/它是不是必须返回 void?的主要内容,如果未能解决你的问题,请参考以下文章

AsyncCallback

轮询与 AsyncCallback 回调 - 慢速 Web 服务的最佳方法?

初始化 AsyncCallback 时出现 GWT RPC ClassNotFoundException

AsyncCallback BeginInvode endinvode 异步调用

Callback 与新的 AsyncCallback(Callback) 有啥不同?

如何在 GWTP 的循环中进行多个 AsyncCallback 调用?