我已经安装了NuGet Package Async for .NET Framework 4,Silverlight 4和5以及Windows Phone 7.5和8.
Version 1.0.16
Run Code Online (Sandbox Code Playgroud)
我使用的是Microsoft .NET 4.0,由于Web Hosting Package Restrictions,我无法升级.(可惜!)
我的测试代码:(我正在使用Linq to SQL Query代替Thread.Sleep)
public class Search
{
public async Task<List<Result>> GetResults(string SearchString)
{
await System.Threading.Tasks.Task.Factory.StartNew(() => Thread.Sleep(1000));
}
}
Run Code Online (Sandbox Code Playgroud)
我的错误:
Cannot await 'System.Threading.Tasks.Task'
Run Code Online (Sandbox Code Playgroud)
http://blogs.msdn.com/b/bclteam/p/asynctargetingpackkb.aspx谈到了这个错误,但它并不是真正的答案,因为我没有使用VB,而且我已经在做解决方案所描述的内容了.
[编辑] 我收到警告:
Warning 4 The primary reference "Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" could not be resolved because it has an indirect dependency on the framework assembly "System.Runtime, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which could not be resolved in …Run Code Online (Sandbox Code Playgroud) 我想知道如果我在没有使用await的情况下调用标记为async的方法会发生什么.考虑这个例子:
private int id = 0;
async Task Initialize()
{
var content = await LoadFromDisk(id);
await Process(content);
return;
}
DataId
{
get { return id; }
set { id = value; Initialize(); }
}
Run Code Online (Sandbox Code Playgroud)
我知道这会产生一个编译警告,但我的问题是,如果在Initialize()中等待的方法调用仍然可以像预期的那样工作.正如您所看到的那样,setter不需要等待Initialize(),因为没有返回值,它是属性的setter的最后一次调用.这是一种火,忘了.
我想这样做的原因是我想将MVVM和数据后端结合起来,迫使我使用异步方法.
在上面的示例中,用户从列表中选择条目,程序应该在视图的另一部分中显示有关条目的详细信息.
我想将列表的当前选定条目绑定到DataId,每当用户更改选择时,它都会更新详细信息视图.当然,可以从事件处理程序执行异步方法调用,但为了更清晰的MVVM实现(主要使用数据绑定),我想避免使用事件处理程序.