2012-01-04 21 views
5

Sử dụng Visual Studio Async CTP (Phiên bản 3) Tôi đang cố gắng hiểu cách tôi có thể "bao bọc" mã hiện tại bằng cách sử dụng khung này.Thông tin cơ bản về việc sử dụng Microsoft Async Framework

Ví dụ

Sử dụng thư viện OpenPop.NET Tôi cố gắng để thiết lập kết nối với một máy chủ pop3 và xác nhận tôi có một tên người dùng và mật khẩu hợp lệ.

Vì vậy, hãy nói rằng tôi có một số mã như thế này.

public bool ConnectSync() 
    { 
     bool success = true; 
     Pop3Client client = new Pop3Client(); 

     try 
     { 
      client.Connect("mail.server.com", 110, false); 
      client.Authenticate("username", "password"); 
     } 
     catch 
     { 
      success = false; 
     } 
     return success; 
    } 

Và bây giờ tôi muốn làm cho nó Async hiểu biết của tôi từ những gì tôi đã được đọc và vẽ ra là tôi sẽ kết thúc với một chữ ký phương pháp dọc theo dòng của

public async Task<bool> ConnectAsync() 
    { 

    } 

Tôi tin này là chữ ký chính xác vì nó sẽ là một nhiệm vụ trả về một boolean (?) và tôi đoán là tôi sẽ cần phải sử dụng phương thức TaskEx.Run()? nhưng đó là như xa như tôi có thể có vẻ để có được đầu của tôi xung quanh. Có ai có thể chỉ đúng hướng không?

+0

Những thứ được giới thiệu với Async CTP không phải là khuôn khổ AFAIK, phải không? – tugberk

Trả lời

3

Có, bạn đã đúng cho đến nay.

Cách dễ dàng để chuyển đổi phương pháp của bạn, như bạn nói, chỉ cần bọc nó trong TaskEx.Run do đó phương thức chạy trên một chuỗi chủ đề chuỗi và không chặn chuỗi giao diện người dùng của bạn.

public Task<bool> ConnectAsync() 
{ 
    return TaskEx.Run(() => 
     { 
      bool success = true; 
      Pop3Client client = new Pop3Client(); 

      try 
      { 
       client.Connect("mail.server.com", 110, false); 
       client.Authenticate("username", "password"); 
      } 
      catch 
      { 
       success = false; 
      } 
      return success; 
     } 
    ); 
} 
3

Về cơ bản, để thu được nhiều lợi ích nhất từ ​​CTP không đồng bộ, bạn thực sự có thể thực hiện với các cuộc gọi không đồng bộ. Bạn có thể quấn đồng bộConnectSync phương pháp của bạn trong một nhiệm vụ rất dễ dàng, mà không sử dụng CTP async tại tất cả:

// Note: not an async method in itself 
public Task<bool> ConnectAsync() 
{ 
    return Task.Factory.StartNew<bool>(ConnectSync); 
} 

(Có thể là bạn không cần phải xác định đối số loại ở đây - Tôi có thể không bao giờ nhớ các quy tắc chính xác cho suy luận kiểu bằng cách sử dụng các chuyển đổi nhóm phương pháp.)

Điều đó vẫn sẽ kết thúc một chuỗi trong khi nó đang kết nối. Nếu bạn đồng ý với điều đó, thì ít nhất bạn sẽ kết thúc với một phương pháp bạn có thể gọi từ một phương thức không đồng bộ và chờ đợi một cách thích hợp. Nếu không có gì khác, điều này sẽ cho phép bạn xây dựng phần còn lại của ứng dụng của bạn trở lên bằng cách sử dụng async, và sau đó nếu/khi mã POP3 hỗ trợ async, bạn chỉ có thể viết lại ConnectAsync làm phương thức không đồng bộ.

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