【问题标题】:Async pass multiple parameters into ReportProgress method异步将多个参数传递给 ReportProgress 方法
【发布时间】:2017-03-13 08:23:34
【问题描述】:

如何将多个参数传递给ReportProgress 方法? 我按照本指南:MSDN 创建进度条。我的代码如下所示。

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 没有重载需要 2 个参数

我是这样尝试的,因为在我的实际应用程序中我会有一个ObersableCollection&lt;User&gt;。有没有更好的办法?

【问题讨论】:

  • Progress alreay 允许您报告多个值。只需使用包含所需字段的类,而不是 int,甚至是 Tuple&lt;int,string&gt;。
  • @PanagiotisKanavos 它有效。非常感谢!
  • 你为什么使用Progress而不是订阅ObservableCollection?您的代码没有报告进度,它会更新另一个 DTO 以响应对集合的更改。例如,如果您关心绑定,WPF 确实更新自身以更改集合
  • 是的,我正在使用绑定。你能给我一个使用ObservableCollection的小例子吗? (我 - 想 - 我知道如何一般使用它,但我不知道在这种情况下如何使用它)

标签: c# wpf asynchronous


【解决方案1】:

您应该手动传递第二个参数,因为“Progress”构造函数只使用一个参数执行操作。试试这个:

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

并从 'pProgress.Report' 方法中删除第二个参数:

pProgress.Report(i); 

【讨论】:

    【解决方案2】:

    我希望创建一条消息并将多个值传递给报告进度

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

    【讨论】:

    • 请注意,OP 不使用Progress 报告进度,而是更新另一个 DTO。未使用 userInstance 值。
    • 这对我很有用 - 感谢您发布此内容!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多