2013-04-18 40 views
10

Tôi đang xem qua hướng dẫn này về cách lập trình không đồng bộ trong C# và đã gặp lỗi tôi không chắc chắn cách giải quyết. Đây là liên kết: http://msdn.microsoft.com/en-us/library/hh191443.aspx và lỗi này là:Lập trình không đồng bộ với Async và Await

Cannot find all types required by the 'async' modifier. 
Are you targeting the wrong framework version, or missing a reference to an assembly? 

Tôi đang nhắm mục tiêu .NET framework 4.0 và không chắc chắn như với bất kỳ hội bổ sung cần thiết.

Đây là mã:

public async Task<string> AccessTheWebAsync(Class1 class1, Class2 class2) 
{ 
    // GetStringAsync returns a Task<string>. That means that when you await the 
    // task you'll get a List<string> (urlContents). 
    Task<string[]> listTask = GetList(class1); 

    // send message task 

    // You can do work here that doesn't rely on the string from GetStringAsync. 
    //CompareService(); 

    // The await operator suspends AccessTheWebAsync. 
    // - AccessTheWebAsync can't continue until getStringTask is complete. 
    // - Meanwhile, control returns to the caller of AccessTheWebAsync. 
    // - Control resumes here when getStringTask is complete. 
    // - The await operator then retrieves the string result from getStringTask. 
    string[] listContents = await listTask; 

    // The return statement specifies an integer result. 
    // Any methods that are awaiting AccessTheWebAsync retrieve the length value. 
    return listContents; 
} 

public Task<string[]> GetList(Class1 class1) 
{ 
    var taskArray = Task<string[]>.Factory.StartNew(() => GenerateResults(class1)); 
    return taskArray; 
} 
public string[] GenerateResults(Class1 class1) 
{ 
    string[] results = new string[2]; 
    results[1] = ""; 
    results[2] = ""; 
    return results; 
} 
+2

async - chờ đợi là từ .NET framework 4.5, không 4 –

+2

@CuongLe, 'async/await' là từ' C# -5.0' nhưng tôi sử dụng nó trong .NET 4.0 đã được cài đặt 'Async CTP' b/c Tôi không thể cài đặt .NET-4.5 (hoặc VS2012) trên Windows XP (VS2010). Hãy nghĩ về nó như là phần mở rộng cho đúng .NET-4.0, không phải là phiên bản .NET-4.5 chỉ –

Trả lời

2

Để sử dụng async với NET 4.0 đọc bài viết này: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx.

+2

Tóm lại: cài đặt gói 'Microsoft.Bcl.Async' NuGet. Đó là một gói phát hành trước. –

+1

trừ khi bạn đang sử dụng Windows XP (hoặc VS2010) trong đó Nuget đang đưa gói .NET-4.5 không tương thích với .NET 4.0, máy không có .NET-4.5 (nói cách khác .NET 4.0 trên máy có .NET 4.5 là khác nhau từ .NET 4.0 trên máy không có .NET 4.5). Trên đúng .NET-4.0 [nhận được Async CTP + phần mở rộng khác] (http://stackoverflow.com/a/15972581/200449) mà không cần sử dụng Nuget –

6

Tôi đang nhắm mục tiêu .NET framework 4.0 và không chắc chắn như với bất kỳ hội bổ sung cần thiết

Có thể chạy async/await mã trong .NET 4.0 mà không isntalling .NET 4.5, having included or referenced AsyncCtpLibrary.dll from Async CTP. Không thể cài đặt .NET 4.5 hoặc Visual Studio 2012 trên Windows XP và .NET 4.0 mà không cài đặt .NET 4.5 khác với .NET 4.0 với cài đặt .NET 4.5.
đọc, ví dụ, thảo luận này:

tôi disadvise sử dụng NuGet trên máy tính mà không cần .NET 4.5 để nhận phần mở rộng cho .NET 4.0 vì nó thực sự đang mang các gói tương thích hoặc bị lỗi .NET 4.5 hoặc .NET 4.0 từ .NET 4.5 không tương thích với .NET 4.0 mà không có .NET 4.5

Nhưng mã của bạn có lỗi cú pháp

Bạn nên có sự trở lại loại Task<string[]>, thay vì Task<string> của bạn, trong AccessTheWebAsync() khai phương pháp, tức là bạn nên đã viết:

public async Task<string[]> AccessTheWebAsync(Class1 class1, Class2 class2)() 

thay vì

public async Task<string> AccessTheWebAsync(Class1 class1, Class2 class2)() 

để cho phương pháp này để trở về giá trị của các loại string[]:

return listContents;//where listContents is declared as string[] type 

Cập nhật:
Kiểm tra xem mã OP có chạy sau khi sửa đổi này trên true .NET 4.0 (without .NET 4.5 and VS2012) Windows XP machine with Async CTP

Tại sao câu trả lời của tôi bị bỏ qua? nặc danh ...

Rõ ràng là nếu OP hỏi câu hỏi như vậy mà anh ta chưa cài đặt .NET 4.5. Ông sẽ không thể sử dụng Async Targeting Pack tham khảo "Async for .NET Framework 4, Silverlight 4 and 5, and Windows Phone 7.5 and 8 1.0.16" mà không cần cài đặt VS2012, anв sau này không thể thực hiện trên Wondows XP, với Nuget mang gói sai trong VS2010 không tương thích và không thể sử dụng trên .NET 4.0 mà không có .NET 4.5 cài đặt

Kiểm tra nó nhiều lần, tháng 5 ngữ cảnh

3

Tìm kiếm async trong NuGet quản lý và cài đặt Microsoft Async để chạy async/await mã trong

Các vấn đề liên quan