继续操作之前,请等待操作完成
作者:互联网
我有一个Windows Phone 7应用程序,它将C#与Silverlight一起使用.该应用程序具有触发多个Web服务请求的方法.在代码的另一点,我有一些类似于以下内容的代码:
myProgressBar.Visibility = Visibility.Visible;
while (AreWebServiceCallsDone() == false)
{
// Need "waiting" code here
}
// Proceed
如何使我的UI在不锁定UI的情况下“等待”一小段时间,然后再次检查我的Web服务调用是否完成?
谢谢!
解决方法:
答案是不要让UI完全等待,而是照原样“去(异步)流”.
最终,C#5中的异步内容将解决此特定问题,但没有针对桌面CLR发布它的时间表,更不用说Silverlight或WP7了.
我个人建议使用Microsoft.Phone.Reactive,它是Reactive Extensions(Rx)的WP7版本,并且随SDK一起提供.这是一个相当大的主题,需要花费大量时间来解决,但实际上可以简化您处理异步方案的方式.
假设您的每个Web服务都返回不同类型的数据,我将:
>将每个Web服务调用包装在IObservable1中
>使用Do来“窥视”消息并执行副作用(例如在本地分配值)
>使用“选择”对类型进行“规范化”,以便它们都是同一类型(下一步需要)
>使用ForkJoin并行执行每个请求并处理每个请求的完成时间
1为您的请求创建IObservable实际上取决于您使用的异步模式.假设您使用的是WebClient,这是一个扩展方法,该方法从DownloadStringAsync创建一个Observable作为示例(它看起来很复杂,但它只是在处理错误和取消操作):
public static class ObservableWebClient
{
public static IObservable<string> DownloadStringObservable(
this WebClient webClient, Uri uri)
{
return Observable.Create(observer =>
{
var disposable = new CompositeDisposable();
var completedObservable = Observable.FromEvent<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs
>(
h => new DownloadStringCompletedEventHandler(h),
h => webClient.DownloadStringCompleted += h,
h => webClient.DownloadStringCompleted h= h
);
disposable.Add(completedObservable
.SelectMany(ev =>
{
return (ev.EventArgs.Error != null)
? Observable.Throw<string>(ev.EventArgs.Error)
: Observable.Return(ev.EventArgs.Result);
})
.Subscribe(observer));
disposable.Add(Disposable.Create(
() => webClient.CancelAsync()));
return disposable;
});
}
}
然后可以像这样使用它:
请注意,因为我的数据类型都是相同的(字符串),所以我跳过了“标准化”步骤.这样,我可以将它们全部订阅为数组(如果您想知道的话,这是ForkJoin的工作方式的精妙之处)
var webClientA = new WebClient();
var webClientB = new WebClient();
var webClientC = new WebClient();
Observable.ForkJoin(
webClientA.DownloadStringObservable(uriA),
webClientB.DownloadStringObservable(uriB),
webClientC.DownloadStringObservable(uriC),
)
.ObserveOnDispatcher()
.Subscribe(dataArray =>
{
// All three have completed
this.DataA = dataArray[0];
this.DataB = dataArray[1];
this.DataC = dataArray[2];
});
标签:windows-phone-7,c,silverlight 来源: https://codeday.me/bug/20191208/2090519.html