以下代码在WindowsPhone设备上的ScheduledAgent中执行,但由于我不知道的原因,执行在到达此行时结束:
col = await wl.GetModelsAsync(day, 1, mgr.LastCountryPath, Resolution.PhoneResolutions[3]);
此方法调用下面的方法,执行在该方法的第二行结束。
public async Task<Stream> DownloadAsync(string url)
{
WebRequest rq = WebRequest.Create(url);
WebResponse rp = await Task.Factory.FromAsync<WebResponse>(rq.BeginGetResponse, rq.EndGetResponse, null);
return rp.GetResponseStream();
}
直到今天,所有代码都正常运行,但据我记忆,我的变化并不大。
Deployment.Current.Dispatcher.BeginInvoke((async () =>
{
List<WallpaperModel> col;
try
{
int day = 0;
if (mgr.ImageMode == WallpaperChangeMode.RandomMode)
{
Random r = new Random();
day = r.Next(16);
}
col = await wl.GetModelsAsync(day, 1, mgr.LastCountryPath, Resolution.PhoneResolutions[3]);
}
catch (Exception)
{
NotifyComplete();
return;
}
Stream s = await wl.DownloadAsync(col[0].Image.UriSource.OriginalString);
var hlpr = new LockHelper(s);
await hlpr.TrySetLockAsync(true);
}));
答案 0 :(得分:1)
尝试等待InvokeAsync而不是BeginInvoke:
await Deployment.Current.Dispatcher.InvokeAsync((async () =>
{
List<WallpaperModel> col;
try
{
int day = 0;
if (mgr.ImageMode == WallpaperChangeMode.RandomMode)
{
Random r = new Random();
day = r.Next(16);
}
col = await wl.GetModelsAsync(day, 1, mgr.LastCountryPath, Resolution.PhoneResolutions[3]);
}
catch (Exception)
{
NotifyComplete();
return;
}
Stream s = await wl.DownloadAsync(col[0].Image.UriSource.OriginalString);
var hlpr = new LockHelper(s);
await hlpr.TrySetLockAsync(true);
}));
答案 1 :(得分:0)
Dispatcher.BeginInvoke()基本上将命令(添加文本块文本等)添加到Ui线程队列。等待在线程/任务上使用它时是否富有成效。即使你在Dispatcher.BeginInvoke()上使用await,它也不会做任何事情,除了它只是将删除的内容添加到Ui线程。
我建议将所有业务逻辑放在线程中并等待线程。一旦您的线程成功执行,请使用调度程序更新UI线程。
基本上不要混淆你的任务/线程和调度员。