WPF应用程序中的进度条,用于长时间运行的WCF服务

时间:2017-04-26 14:56:33

标签: c# wpf wcf backgroundworker

我有一个长期运行的WCF服务和一个通过WPF使用它的客户端。使用进度条通知客户端特定进程的完成百分比(WCF中的方法:我需要能够根据服务中的循环计数器显示百分比)

  • 我使用后台工作程序来显示进度百分比,但它没有正确显示进度。 (仅显示0和100而不是值之间)在DEBUG模式下一切正常,但在RELEASE模式下不能正常工作! (进度条在DEBUG模式下按顺序更新)

  • 我尝试使用callbacks / wsDualHttpBinding,但在为所有客户端合并时遇到了一些困难。所以,不得不放弃这个选项。

  • 使用async / await

我搜索了很多链接,但没有任何问题可以解决我的问题。

请指导我如何从WCF服务尚未完成的方法中获取当前/运行值,以便我可以根据此值填充进度条百分比。 (在值之间)

P.S:WCF服务使用wsHttpBinding

以下示例代码:

File "<ipython-input-138-432bd722fae9>", line 6
    for element in list_ if element['selected']:
                                               ^
SyntaxError: invalid syntax

1 个答案:

答案 0 :(得分:0)

了解如何实施。这是我工作代码的一部分。 .xaml文件:

       private async void btnCompare_Click(object sender, RoutedEventArgs e)
    {
        ProgressBarCompare.Value = 0;
        lblCompare.Content = "";
        List<string> list1= (List<string>)Application.Current.Properties["list1"];
        List<string> list2= (List<string>)Application.Current.Properties["list2"];

        List<Result> output = new List<Result>();
        List<Result> passed = new List<Result>();

        int topCount = emailList.Count;
        int currentItem = 0;
        int topBound = topCount - 1;

        while (currentItem < topCount)
        {
            var hash = await CheckOperation(list1[currentItem]); // this line perform progress bar to be filled

            var result = list2.Contains(hash);

            //some operations

            if (Convert.ToInt32(Math.Ceiling(100d * currentItem / topBound)) < 51)
            {
                Style style = this.FindResource("LabelTemplateNotFilled") as Style;
                lblCompare.Style = style;
            }
            else
            {
                Style style = this.FindResource("LabelTemplateFilled") as Style;
                lblCompare.Style = style;
            }

            ProgressBarCompare.Value = Convert.ToInt32(Math.Ceiling(100d * currentItem / topBound));
            lblCompare.Content = Convert.ToInt32(Math.Ceiling(100d * currentItem / topBound)) + "%";

            currentItem++;
        }

        lblCompare.Content = "COMPLETE";

    }

进程功能:

private async Task<string> CheckOperation(string input)
    {
        var result = "";
        await Task.Run(() =>
        {
            //perform some code
        });

        return result;

    }

和核心功能:

 id = Convert.ToInt32( cmd1.ExecuteScalar());