【发布时间】:2013-12-31 03:24:08
【问题描述】:
好的,我正在开发一个小型 MP3 播放器应用程序。它使用 DataSet 来保存 MP3 文件信息。这个问题是关于如何异步加载我的数据集。我一直在阅读很多东西,并尝试了很多东西,但我就是不明白。我要做的就是进行一个长时间运行的数据集填充过程并使其异步。
一开始,我的 DataSet (LoadMusic) 方法如下所示:
public partial class dsMusicPlayer
{
public void LoadMusic()
{ ... }
}
它扫描目录结构中的 MP3 文件,并用文件信息(标题、艺术家、专辑等)填充 DataSet。它可以工作,但需要一分钟左右的时间才能运行,并且会自然地阻止 UI。因此,异步的完美候选者。我像这样重写了我的加载方法(否则不改变实现):
public async void LoadMusicAsync()
{
}
我知道事情不会那么简单,但我会一步一步来。果然,我收到一个警告,说我的异步方法“缺少等待操作符”。我所做的所有阅读都显示在方法调用之前使用了“await”,因此我将原始方法的主体重构为一个虚拟私有方法,其唯一目的是允许在容器中使用“await”关键字/公共方法:
public async void LoadMusicAsync()
{
await LoadMusicInner();
}
private void LoadMusicInner()
{
}
接下来我发现我不能“等待无效”。美好的。我将我的私有方法更改为
private Task LoadMusicInner()
{
}
但现在我收到错误消息“并非所有代码路径都返回一个值”——这是有道理的,因为返回类型是任务。这就是我觉得卡住的地方。我的方法一开始是无效的,因为它真的没有返回任何东西。我应该怎么做?
【问题讨论】:
-
顺便说一句,我最终放弃了一个我理解的旧式 BackgroundWorker 对象,但我的问题仍然存在。
-
有很多关于 async/await 基础的文章。
-
我读了一小部分,但实际上什么也没有。
标签: .net asynchronous async-await c#-5.0