【发布时间】: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在主线程中运行该代码。见:stackoverflow.com/questions/6238064/… -
谢谢你们!一旦你指出了主要问题,我在@SteveWillcock 的回答中找到了这个很好的解决方案:stackoverflow.com/questions/3420282/…
标签: c# asynchronous asyncsocket asynccallback