2012-09-13 35 views
22

Trong một ứng dụng windows 8 trong C#/XAML, đôi khi tôi muốn gọi một phương thức awaitable từ một phương thức không đồng bộ.Có thể gọi một phương thức không thể chờ đợi bằng phương pháp không đồng bộ không?

Trên thực tế là nó đúng để thay thế này:

public async Task<string> MyCallingMethod() 
    { 
     string result = await myMethodAsync(); 
     return result; 
    } 

của thành viên này:

public string MyCallingMethod() 
    { 
     Task.Run(async() => { 
      string result = await myMethodAsync(); 
      return result; 
      }); 
    } 

Ưu điểm đối với tôi là tôi có thể sử dụng mà không cần chờ đợi MyCallingMethod nhưng là này có đúng không? Điều này có thể là một lợi thế nếu tôi muốn chuyển một tham số ref cho MyCallingMethod vì nó không thể có tham số ref trong một phương thức async.

+0

sẽ không hoạt động. hàm async ẩn danh của bạn sẽ không trả về giá trị cho hàm bên ngoài. – Denis

Trả lời

15

Bạn thực sự không nên thử làm điều gì đó tương tự nếu bạn đang ở trên chuỗi giao diện người dùng, vì điều đó có nghĩa là bạn sẽ chặn chuỗi. Thay vào đó, bạn nên làm việc xung quanh tham số ref, ví dụ bằng cách chấp nhận tham số của một loại lớp đơn giản, chứa giá trị bạn muốn thay đổi.

Một lý do khác tại sao không làm điều này là nó vẫn không cho phép bạn sử dụng các tham số ref, bởi vì lambdas không thể truy cập thông số ref của phương pháp kèm theo.

Nhưng nếu bạn thực sự muốn làm điều này (một lần nữa, tôi thực sự nghĩ rằng bạn không nên), sau đó bạn sẽ cần phải nhận được kết quả của Task. Một cái gì đó như:

public string MyCallingMethod() 
{ 
    var task = Task.Run(async() => 
    { 
     return await myMethodAsync(); 
    }); 
    return task.Result; 
} 
+0

Nhiệm vụ tuyệt vời, tự giải quyết và trả lại kết quả. Cảm ơn – DRapp

40

Trong phương pháp phi async bạn có thể bắt đầu công tác không đồng bộ và không chờ đợi kết quả:

public void MyCallingMethod() 
{ 
    Task t = myMethodAsync(); 
} 

hoặc bạn có thể đính kèm ContinueWith xử lý sự kiện, được gọi là sau khi kết thúc nhiệm vụ,

public void MyCallingMethod() 
{ 
    myMethodAsync().ContinueWith(
     result => 
     { 
      // do stuff with the result 
     }); 
} 

hoặc bạn có thể nhận được kết quả từ các nhiệm vụ đồng bộ:

public string MyCallingMethod() 
{ 
    string result = myMethodAsync().Result; 
    return result; 
} 
Các vấn đề liên quan