2014-12-17 14 views
7

tôi có cửa sổ ứng dụng mẫu đơn này là mã của tôi:Progress <T> không có báo cáo chức năng

private async void btnGo_Click(object sender, EventArgs e) 
    { 
     Progress<string> labelVal = new Progress<string>(a => labelValue.Text = a); 
     Progress<int> progressPercentage = new Progress<int>(b => progressBar1.Value = b); 

     // MakeActionAsync(labelVal, progressPercentage); 
     await Task.Factory.StartNew(()=>MakeActionAsync(labelVal,progressPercentage)); 
     MessageBox.Show("Action completed"); 
    } 

    private void MakeActionAsync(Progress<string> labelVal, Progress<int> progressPercentage) 
    { 
      int numberOfIterations=1000; 
      for(int i=0;i<numberOfIterations;i++) 
      { 
       Thread.Sleep(10); 
       labelVal.Report(i.ToString()); 
       progressPercentage.Report(i*100/numberOfIterations+1); 
      } 
    } 

tôi nhận được biên soạn lỗi rằng "System.Progress' không chứa một định nghĩa cho 'Báo cáo' và không có phần mở rộng phương pháp 'báo cáo' chấp nhận một cuộc tranh luận đầu tiên của loại 'System.Progress' có thể được tìm thấy (là bạn thiếu một chỉ thị sử dụng hoặc tham khảo một hội?)"

nhưng Nếu bạn nhìn vào lớp Progress:

public class Progress<T> : IProgress<T> 

và giao diện IProgress có chức năng báo cáo:

public interface IProgress<in T> 
{ 
    // Summary: 
    //  Reports a progress update. 
    // 
    // Parameters: 
    // value: 
    //  The value of the updated progress. 
    void Report(T value); 
} 

tôi thiếu gì?

Trả lời

11

Progress<T> đã triển khai phương pháp với explicit interface implementation. Vì vậy, bạn không thể truy cập phương thức Report với loại Progress<T>. Bạn cần truyền nó đến IProgress<T> để sử dụng Report.

Chỉ cần thay đổi việc kê khai để IProgress<T>

IProgress<int> progressPercentage = new Progress<int>(b => progressBar1.Value = b); 

Hoặc sử dụng một dàn diễn viên

((IProgress<int>)progressPercentage).Report(i*100/numberOfIterations+1); 

Tôi thích phiên bản cũ, thứ hai là khó xử.

+0

những gì bạn có ý nghĩa bởi "thực hiện giao diện rõ ràng" các phương pháp giao diện không nên được hiển thị trong phân lớp? –

+0

@ilayzeidman Tôi đã giải thích nó [ở đây] (http://stackoverflow.com/a/25585242/2530848) –

+0

Cảm ơn! Tôi hiểu tôi không biết về lựa chọn đó ... –

2

Như được hiển thị trong documentation, phương pháp đó được triển khai bằng cách sử dụng triển khai giao diện rõ ràng. Điều đó có nghĩa là nó bị ẩn nếu bạn không sử dụng giao diện để truy cập phương thức.

Triển khai giao diện rõ ràng được sử dụng để làm cho một số thuộc tính và phương thức hiển thị khi tham chiếu đến giao diện, nhưng không xuất hiện trong bất kỳ lớp dẫn xuất nào. Vì vậy, bạn chỉ 'thấy' chúng khi bạn sử dụng IProgress<T> làm loại biến của mình, nhưng không phải khi sử dụng Progress<T>.

Hãy thử điều này:

((IProgress<string>)progressPercentage).Report(i*100/numberOfIterations+1); 

Hoặc khi bạn chỉ cần tham khảo tài sản và phương pháp có sẵn trong tờ khai giao diện:

IProgress<string> progressPercentage = ...; 

progressPercentage.Report(i*100/numberOfIterations+1); 
Các vấn đề liên quan