2012-08-28 30 views
12

Nói rằng tôi có một giao diệnLàm thế nào để sử dụng async trên một phương pháp giao diện trống

interface IFoo { 
    Task SomeMethodAsync(); 
} 

Và tôi muốn thực hiện giao diện này, nhưng đối với một lớp phương pháp này là trống.

Tôi có nên sống với cảnh báo này tạo ra không?

async Task SomeMethodAsync() {} 

Hoặc tôi có nên trả lại một số tác vụ giả không?

async Task SomeMethodAsync() { await Task.Run(() => {}); } 

Hoặc có tùy chọn nào khác không?

Ngoài ra, tôi muốn triển khai phương thức này làm phương thức giao diện rõ ràng. Điều đó có tạo nên sự khác biệt nào không?

+0

có thể trùng lặp của [Giao diện và phương thức không đồng bộ] (http://stackoverflow.com/questions/13573516/interfaces-and-async-methods) – abatishchev

Trả lời

14

Các phương thức trả về Task không cần phải là async.

Tôi muốn giới thiệu một cái gì đó như thế này:

Task IFoo.SomeMethodAsync() 
{ 
    return Task.FromResult(true); 
} 

Tôi giả định rằng nếu điều này là một phương pháp đồng bộ, bạn sẽ chỉ có một cơ quan phương pháp trống rỗng; đây là số tương đương async của một thân phương thức trống.

2

Nó chỉ phụ thuộc vào cách bạn quyết định khuôn khổ đó phải xử lý các trường hợp như vậy.

Bạn có, imo, một vài lựa chọn:

  • tăng một ngoại lệ (sẽ phá vỡ immidiately thực hiện, và bạn phải xử lý nó trong một cách nào đó ở một số nơi trong chuỗi thực hiện).

  • trở default-value (có thể là một giải pháp được cung cấp bởi bạn:. Chỉ là một nhiệm vụ có sản phẩm nào mà không làm bất cứ điều gì xấu về việc này là tôi gọi hàm mong nó một cái gì đó, nó không thông báo cho tôi về bất cứ điều gì nhưng không làm bất cứ điều gì cả. Imo, đây là thiết kế xấu.

  • trở lại một số not-valid-value, mà chặn bởi người gọi để người gọi "biết" rằng cái gì là không ok.

0

Tôi đã thực hiện điều này với lớp cơ sở trừu tượng. Tôi đã thử phương pháp Stephen Cleary, nhưng đã nhận lỗi biên dịch trong C# 6.

Một ví dụ về phương pháp cơ sở của tôi:

protected abstract Task OnFoo(Bar bar); 

Đây là những gì tôi đã làm trong lớp có nguồn gốc của tôi:

protected override async Task OnFoo(Bar bar) 
{ 
    await Task.FromResult(true); 
} 

Vấn đề với câu trả lời khác là từ khóa return trong cụm từ. Bởi vì giá trị trả về của Task về cơ bản là void, bạn không thể trả lại bất kỳ thứ gì. Ngoài ra, bắt buộc phải có từ khóa await.

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