2014-12-17 9 views
7

Ho Windows sotto forma di app questo è il mio codice:Progress <T> non ha funzione di report

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

ottengo errore di compilazione che "System.Progress' non contiene una definizione per 'Report' e senza estensione metodo 'report' accettare un primo argomento di tipo 'System.Progress' stato trovato (che le manca un un riferimento all'assembly direttiva using o?)"

ma Se si guarda alla classe Progress:

public class Progress<T> : IProgress<T> 

e l'interfaccia IProgress ha la funzione Report:

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

Che cosa mi manca?

risposta

11

Progress<T> ha implementato il metodo con explicit interface implementation. Pertanto non è possibile accedere al metodo Report con l'istanza di tipo Progress<T>. Devi lanciarlo su IProgress<T> per utilizzare Report.

Basta modificare la dichiarazione di IProgress<T>

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

o utilizzare un getto

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

preferisco versione precedente, quest'ultimo è imbarazzante.

+0

cosa si intende per "implementazione dell'interfaccia esplicita" il metodo di interfaccia non dovrebbe essere visibile in sottoclasse? –

+0

@ilayzeidman L'ho spiegato [qui] (http://stackoverflow.com/a/25585242/2530848) –

+0

Grazie! Capisco che non sapevo di questa opzione ... –

2

Come illustrato nello documentation, tale metodo viene implementato utilizzando un'implementazione esplicita dell'interfaccia. Ciò significa che è nascosto se non si utilizza l'interfaccia per accedere al metodo.

Implementazioni esplicite dell'interfaccia vengono utilizzate per rendere visibili alcune proprietà e metodi quando fanno riferimento all'interfaccia, ma non in alcuna classe derivata. Quindi li si "vedono" solo quando si utilizza IProgress<T> come tipo di variabile, ma non quando si utilizza Progress<T>.

Prova questo:

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

O quando avete solo bisogno di fare riferimento a proprietà e metodi disponibili nella dichiarazione di interfaccia:

IProgress<string> progressPercentage = ...; 

progressPercentage.Report(i*100/numberOfIterations+1); 
Problemi correlati