2014-12-17 6 views
7

Ich habe Windows Form app dies ist mein Code:Fortschritt <T> nicht über Reportfunktion

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); 
      } 
    } 

ich Kompilierungsfehler, dass „System.Progress' keine Definition enthält für‚Report‘und keine Erweiterung Methode ‚Report‘ ein erstes Argument vom Typ ‚System.Progress‘ Annahme gefunden werden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis?)“

aber Wenn Sie Fortschritt Klasse aussehen:

und die Schnittstelle IProgress hat Funktion Report:

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

Was bin ich?

Antwort

11

Progress<T> implementiert die Methode mit explicit interface implementation. Sie können also nicht auf die Report-Methode mit der Instanz Progress<T> zugreifen. Sie müssen es in IProgress<T> umwandeln, um Report zu verwenden.

einfach die Erklärung ändern IProgress<T>

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

oder verwenden Sie eine gegossene

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

Ich ziehe frühere Version, letztere ist umständlich.

+0

was Sie mit „expliziter Schnittstellenimplementierung“ bedeuten die Interface-Methode sollte nicht in der Unterklasse sichtbar sein? –

+0

@ilayzeidman Ich erklärte es [hier] (http://stackoverflow.com/a/25585242/2530848) –

+0

Vielen Dank! Ich verstehe, dass ich über solche Option nicht gewusst habe ... –

2

Wie in der documentation gezeigt, wird diese Methode mithilfe einer expliziten Schnittstellenimplementierung implementiert. Das bedeutet, dass es ausgeblendet wird, wenn Sie nicht über die Schnittstelle auf die Methode zugreifen.

Explizite Schnittstellenimplementierungen werden verwendet, um einige Eigenschaften und Methoden sichtbar zu machen, wenn auf die Schnittstelle referenziert wird, aber nicht in abgeleiteten Klassen. Sie "sehen" also nur, wenn Sie IProgress<T> als Variablentyp verwenden, aber nicht bei Verwendung von Progress<T>.

Versuchen Sie folgendes:

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

Oder wenn Sie nur Eigenschaften und Methoden in der Interface-Deklaration zur Verfügung verweisen müssen:

IProgress<string> progressPercentage = ...; 

progressPercentage.Report(i*100/numberOfIterations+1); 
Verwandte Themen