【发布时间】:2014-07-07 19:02:44
【问题描述】:
我有一个 Silverlight 网站,它正在调用 WCF 服务,以便它可以进行一些服务器端加载。 WCF 调用是异步的,因为它已准备好 Silverlight,所以在它完成后,我正在从 CompletedEventArgs 读取数据以加载类。但是,我不确定范围界定是如何工作的。 data 在新任务的范围内是否与外部相同?它似乎从未设置为true。我知道该服务正在运行,因为正在发生异步调用,但是我无法调试完成事件触发,因为我无法将调试器附加到“ASP.net-hosted-Silverlight”(有没有办法解决这个问题?我希望能够在托管 .aspx 时调试 Silverlight...)。 我用this link. 解决了这个问题我目前正在测试我的项目,但我仍然很好奇这个范围是如何工作的。
感谢您的帮助!
编辑:我意识到这可能是构建此功能的一种糟糕的方式,我愿意提供其他建议:)
// Objects constructor calls async WCF task, upon completion of which (grammar?)
// sets IsComplete to true
Foo data = new Foo(param);
Task waitForComplete = Task.Factory.StartNew(() =>
{
while (!data.IsComplete)
{
// Wait 1 second, then poll again
System.Threading.Thread.Sleep(1000 * 1);
}
});
Task.WaitAll(new Task[] { waitForComplete });
// Now that the task has completed, we can access its data
bar.AddRange(data.GetFoo());
【问题讨论】:
-
您可以在任务上调用
Wait,或者只是在初始线程上旋转。不清楚在这里使用Task对您有什么作用。 -
-.- 你说得很好。它在这里对我完全没有任何作用:) 这是其中一个星期一......我将只拥有
while循环 -
@ADam 但我认为问题在于您阻塞了主线程,这可能会阻止 Foo 任务完成并设置 IsComplete...
-
那么 Reed 的回答解释了一种更好的模式供您在这种情况下使用。设置
IsComplete时是否引发事件? -
只有在异步 WCF 完成的回调上会发生什么,这不是问题。请参阅我对 Reed 回答的评论。 Mike 的建议解决了这个问题。
标签: c# wcf silverlight asynchronous scope