2012-11-23 46 views
8

Nếu tôi có một giao diện như:Async programmic và ảo chức năng

using System.Threading.Tasks; 

... 

public interface IFoo 
{ 
    Task doIt(); 

    Task<bool> doItAndReturnStuff(); 
} 

và một trong các lớp thực hiện giao diện này chỉ xảy ra với không đòi hỏi phương pháp async, làm thế nào tôi có thể sửa ghi đè lên các chức năng này?

Nói cách khác, làm cách nào để trả lại chính xác "void" và "bool" được bao trong đối tượng Task?

Ví dụ:

public class FooHappensToNotNeedAsync : IFoo 
{ 
    public override Task doIt() 
    { 
    // If I don't return anything here, I get 
    // error that not all code paths return a value. 
    // Can I just return null? 
    } 

    public override Task<bool> doItAndReturnStuff() 
    { 
    // If I want to return true, how to I do it? 
    // This doesn't work: 
    return true; 
    } 
} 

LƯU Ý - Tôi không thể tước những thứ công tác hoàn toàn vì một số các lớp học mà thực hiện giao diện này trên thực tế asynch.

Cảm ơn

+0

'trở Task.Run (() => true); ' –

+1

@ LB: Điều đó tạo ra thêm công việc không có lý do thực sự và ít có thể dự đoán được hơn là trả lại một tác vụ đã hoàn thành. –

Trả lời

15

Nó không rõ ràng những gì bạn đang cố gắng để đạt được, nhưng có một cách tiếp cận (trong đó sẽ trông giống như hầu hết mã "bình thường") có lẽ là chỉ để làm cho họ phương pháp async anyway:

public async Task DoIt() 
{ 
    // No-op 
} 

public async Task<bool> DoItAndReturnStuff() 
{ 
    return true; 
} 

Nếu không có bất kỳ biểu thức await nào, phương pháp sẽ hoàn tất đồng bộ. Bạn sẽ nhận được cảnh báo trên mỗi phương pháp, nhưng bạn có thể tắt tính năng này chỉ cho đoạn mã này bằng cách sử dụng #pragma.

Ngoài ra - và tôi đoán đơn giản hơn về mặt không đòi hỏi một #pragma để vô hiệu hóa các cảnh báo - sẽ được sử dụng Task.FromResult:

public Task DoIt() 
{ 
    // Returns a Task<bool>, but that's okay - it's still a Task 
    return Task.FromResult(true); 
} 

public Task<bool> DoItAndReturnStuff() 
{ 
    return Task.FromResult(true); 
} 
+0

Đoạn mã đầu tiên của bạn ở trên - "có lẽ chỉ để làm cho chúng không đồng bộ phương pháp anyway" - sẽ không biên dịch. Đó là lý do tại sao tôi hỏi câu hỏi này. Bạn sẽ nhận được "lỗi CS0161: không phải tất cả các đường dẫn mã trả về một giá trị". Tôi đoán đó là lý do tại sao bạn có một chút nhận xét bực bội trong đó :). BAO GIỜ, đoạn thứ hai của bạn, đặc biệt là việc thực hiện DoIt(), chính xác là loại hack tôi đang tìm kiếm. Cảm ơn nhiều! – swinefeaster

+1

@swinefeaster: Phiên bản đầu tiên thực sự cần biên dịch, nếu bạn đã bao gồm công cụ sửa đổi không đồng bộ. Bạn có chắc chắn bạn đã làm? Sẽ kiểm tra lại khi tôi quay lại máy tính. –

+1

@swinefeaster: Tôi chỉ thử nó, và nó ổn - mặc dù tôi đã phải loại bỏ 'override' vì nó thực hiện một giao diện, không ghi đè lên một phương thức lớp cơ sở. Tôi chỉ nhận được CS0161 mà không có công cụ sửa đổi 'async'. –

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