2012-03-02 107 views
1

我添加了AsyncCtpLibrary v.3。从异步网页抓取了一些示例代码。将它包装在TestFixture中以供玩耍。异步等待关键字错误

我收到错误:任何想法为什么?

错误1 - 无效的标记 '无效' 类,结构或接口成员声明

错误2 - ;预计

代码:

[TestFixture] 
public class AsyncTests 
{ 
    [Test] 
    public async void AsyncRunCpu() 
    { 
     Console.WriteLine("On the UI thread."); 

     int result = await TaskEx.Run(
      () => 
       { 
        Console.WriteLine("Starting CPU-intensive work on background thread..."); 
        int work = DoCpuIntensiveWork(); 
        Console.WriteLine("Done with CPU-intensive work!"); 
        return work; 
       }); 

     Console.WriteLine("Back on the UI thread. Result is {0}.", result); 
    } 

    public int DoCpuIntensiveWork() 
    { 
     // Simulate some CPU-bound work on the background thread: 
     Thread.Sleep(5000); 
     return 123; 
    } 
} 
+0

我假设你的意思是你使用VS11作为异步/等待关键字。不知道它是否会有很大的不同,但尝试新的Task.Factory.StartNew。在运行命令之后尝试添加.Result。 .Result是任务返回类型,在本例中为int – Jon 2012-03-02 20:33:19

+1

检查“My Documents”下是否有Async CTP文件夹。异步CTP [在论坛上讨论](http://social.msdn.microsoft.com/Forums/en-US/async/threads)有许多安装问题。归结起来,异步CTP是一种带外更新,会干扰其他VS更新。在这一点上(VS11迫在眉睫),我认为他们不太可能修复安装程序。一旦VS11发布,我预计Async CTP将被拉出并且不再可用。 – 2012-03-03 00:44:24

回答

0

我认为它应该是:

[Test] 
public async Task AsyncRunCpu() 
{ 
    // ... 
} 

为据我所知,使用void返回类型的异步方法在某种程度上是特别的 - 想知道为什么编译器不会为这种情况发出警告...

顺便说一句,您可以使用async/await与.NET4 .0,只需在项目中添加对Microsoft.BCL.Async的引用即可。唯一的区别是某些Task相关功能位于TaskEx类型中。

4

你不能简单地将.dll添加到您的项目,它的工作:异步CTP扩展了C#语言的语法,“正常”的编译器不理解新的关键字,即使所需的运行时程序集存在。您需要使用官方安装程序进行安装。 (注:卸载自上次服务包,首先Visual Studio的更新,或者安装将不会成功,您可以重新安装更新之后。)

+1

为什么在VS11 beta现在可用时使用异步CTP,并且可能不会影响VS10的安装? – 2012-03-02 20:39:41

+0

@JonSkeet没有异步CTP,运行时需要.NET 4.5,对吧?这不一定是坏事,但要牢记。 – hvd 2012-03-02 20:47:57

+0

我暂时不会亲自使用Async CTP进行制作 - 这里有太多的陷阱。相反,我肯定只会使用测试版。 – 2012-03-02 20:53:29