0

我在 Windows 商店应用程序中使用文档下载器,但我遇到了任务问题。所以这是我的代码示例:

任务创建并开始

...
HttpDownloader httpDownloader = new HttpDownloader(server);

Action<object> action = (object doc ) => httpDownloader.DownloadDocument((Document)doc);

Task t1 = new Task(action,selection.doc);
t1.Start();
...

下载文件方法

...
FileSavePicker savePicker = new FileSavePicker();
savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
// Dropdown of file types the user can save the file as
savePicker.FileTypeChoices.Add("Application/pdf", new List<string>() { ".pdf" });
// Default file name if the user does not type one in or select a file to replace
savePicker.SuggestedFileName = doc.name+"_"+doc.version;

StorageFile file = await savePicker.PickSaveFileAsync(); // Here an exception is launch.
...

每次我得到:

未找到元素(HRESULT 异常:0x80070490)

没有任务,我的代码工作正常,但由于我想使用任务来管理不同的下载,我有这个错误。

4

1 回答 1

1

Action在随机池线程上运行,该线程与您的主线程不同(由 安排Task.Start)。在那里您可以访问您的doc对象,我假设该对象是在主线程上创建的。这可能是故障的原因。

通常,您不应跨不同线程访问对象(尤其是 UI 元素),除非它们被专门设计为线程安全的。

已编辑:您可能在这里不需要任务。只需执行await savePicker.PickSaveFileAsync()并将您的外部方法标记为async(当前创建任务的方法)。

为了更好地了解您所在的线程,添加如下调试跟踪可能会有所帮助:

Debug.Print("<Method name>, Thread: {0}", Thread.CurrentThread.ManagedThreadId);
于 2013-08-08T14:09:14.290 回答