Dispatcher.BeginInvoke的执行在到达await语句时结束

时间:2014-04-23 15:24:18

标签: c# windows-phone-8 async-await webrequest dispatcher

以下代码在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);

}));

2 个答案:

答案 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线程。

基本上不要混淆你的任务/线程和调度员。