2017-03-13 19 views
2

ReportProgressメソッドに複数のパラメータを渡すにはどうすればよいですか? 私はこのガイドに従っていた:MSDN進捗バーを作成する。私のコードはこのように見えます。非同期で複数のパラメータをReportProgressメソッドに渡す

MainWindow.xaml

public User User { get; set; } 

public MainWindow() 
{ 
    InitializeComponent(); 
    this.User = new User(); 
    this.DataContext = User; 
} 

private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var progressIndicator = new Progress<int>(ReportProgress); //here is the error 
    await this.User.ReadUsers(progressIndicator, this.User) 
} 

void ReportProgress(int value, User pUser) 
{ 
    this.User.Val = value; 
} 

User.xaml

public async Task<bool> ReadUsers(IProgress<int> pProgress, User pUser) 
{ 
    for (int i = 1; i < 11; i++) 
    { 
     await Task.Delay(500); 
     pProgress.Report(i, pUser); 
    } 

    return true; 
} 

ご覧の通り、私はReportProgress方法に単純に新しいパラメータ(User pUser)を追加しようとしていました。今すぐButton_Clickメソッド内にエラーが表示されます(行がマークされています)。

引数1:System.Actionにメソッドグループから変換することはできません

'System.Progress.Progress(System.Action)' の

最良のオーバーロードされたメソッドの試合 - 方法はありませんいくつかの無効な引数

を持っていますReport-Methodのための過負荷は、私の実際のアプリケーションでは、私はObersableCollection<User>を持っていますので、私は、このようにそれをしようとしていた2つの引数

をとります。多分私が行くべきより良い方法はありますか?

+0

進捗alreayを報告するために複数の値を渡します複数の値を報告することができます。 'int'ではなく、' Tuple 'の代わりに必要なフィールドを持つクラスを使ってください。 –

+0

@PanagiotisKanavosそれは動作します。どうもありがとう! – MyNewName

+0

なぜObservableCollectionに加入する代わりに 'Progress'を使用していますか?コードが進行状況を報告していない場合、コレクションの変更に応じて別のDTOが更新されます。たとえば、バインディングが気になる場合、WPF *はコレクションの変更に自身を更新します –

答えて

3

「進捗状況」コンストラクタは1つの引数を持つアクションしか取らないので、2番目のパラメータは手動で渡す必要があります。このお試しください:

new Progress<int>(i => ReportProgress(i, this.User)); 

をそして 'pProgress.Report' メソッドから2番目の引数を削除:

pProgress.Report(i); 
+0

それは魅力のように動作します、ありがとう! – MyNewName

1

私はメッセージを作成好むと進捗

public class RMssg 
{ 
    public int ProgressIndicator { get; set; } 
    public User userInstance { get; set; } 
} 

private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var progressIndicator = new Progress<RMssg>(r => ReportProgress(r)); 
    await this.User.ReadUsers(progressIndicator, this.User); 
} 

void ReportProgress(RMssg rMssg) 
{ 
    this.User.Val = rMssg.ProgressIndicator; 
    var user = rMssg.userInstance; 
} 



public async Task<bool> ReadUsers(IProgress<RMssg> pProgress, User pUser) 
{ 
    for (int i = 1; i < 11; i++) 
    { 
     await Task.Delay(500); 
     var rMssg = new RMssg() { ProgressIndicator = i, userInstance = pUser }; 
     pProgress.Report(rMssg); 
    } 

    return true; 
} 
+0

OPは進捗状況を報告するのに 'Progress'を使用せず、別のDTOを更新することに注意してください。 'userInstance'値は使用されません。 –

関連する問題