Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的进度条和backgroundworker#_C#_Multithreading_Progress Bar_Backgroundworker - Fatal编程技术网

C# C中的进度条和backgroundworker#

C# C中的进度条和backgroundworker#,c#,multithreading,progress-bar,backgroundworker,C#,Multithreading,Progress Bar,Backgroundworker,目前我正在从事一个项目,该项目需要消耗来自web服务的大量数据, 服务类向服务器发送输入日期并返回结果, 由于it流程耗时,需要用户组合progressbar和backgroundworker向用户显示流程百分比。我浏览了很多关于这个主题的示例代码,但仍然无法找到最好的方法。你能帮忙吗, 我的代码如下: private MyCollection[] callWebService(string[] Inputs, string method) { List<string> r

目前我正在从事一个项目,该项目需要消耗来自web服务的大量数据, 服务类向服务器发送输入日期并返回结果, 由于it流程耗时,需要用户组合progressbar和backgroundworker向用户显示流程百分比。我浏览了很多关于这个主题的示例代码,但仍然无法找到最好的方法。你能帮忙吗, 我的代码如下:

private  MyCollection[] callWebService(string[] Inputs, string method)
{
    List<string> results = new List<string>();
    string fiel dNames = ""; // todo - fix this if nothing left in loop
    int sizeOfArray = 500;
    for (int i = 0; i < Inputs.Length; i = i + sizeOfArray)
    {
        string[] outputRecords;
        int errorCode;
        string errorString;
        string[] thisFiveHundred = createSubArray(Inputs, i, sizeOfArray);


        iq.NameValuePair[] namevaluepairs = new iq.NameValuePair[0];
        fieldNames = iqOfficeWebservice.BatchStan(method, thisFiveHundred, null, "",        out outputRecords, out errorCode, out  errorString);
        results.AddRange(outputRecords);
    }
    results.ToArray();
    IAddress[] formattedResults = convertStringsToInputs(fieldNames, results);
    return formattedResults;
}
private MyCollection[]callWebService(string[]输入,string方法)
{
列表结果=新列表();
字符串fiel dNames=“”;//todo-如果循环中没有任何内容,请修复此问题
int-sizeOfArray=500;
对于(int i=0;i
private void cmdButton\u单击(对象发送者,事件参数e)
{
BackgroundWorker工人=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
worker.DoWork+=新的doworkereventhandler(worker\u DoWork);
worker.ProgressChanged+=新的progresschangedventhadler(worker\u ProgressChanged);
worker.RunWorkerAsync();
}
私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
对于(int i=0;i<101;i++)
{
工人进度报告(一);
系统线程线程睡眠(1000);
}
}
私有void worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
lblProgress.Text=(“进度:+e.ProgressPercentage.ToString()+“%”);
}
可以找到其他信息。

private void cmdButton\u单击(对象发送者,事件参数e)
{
BackgroundWorker工人=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
worker.DoWork+=新的doworkereventhandler(worker\u DoWork);
worker.ProgressChanged+=新的progresschangedventhadler(worker\u ProgressChanged);
worker.RunWorkerAsync();
}
私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
对于(int i=0;i<101;i++)
{
工人进度报告(一);
系统线程线程睡眠(1000);
}
}
私有void worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
lblProgress.Text=(“进度:+e.ProgressPercentage.ToString()+“%”);
}

附加信息可以找到。

< P>除了WPF或WiFrand中的技术实现,例如有一个基本方面要考虑。

  • 您是否从web服务获得进度反馈
否则,您可能无法正确预测web服务需要的时间。这取决于您无法影响的因素(如服务器负载、网络流量等)。在这种情况下,不建议使用进度条,因为它会给用户带来奇怪的体验

然后,您可以选择显示请求可能需要几分钟时间的文本信息,以及显示带有
isindedite
标志集(WPF)的进度,以显示持续的进度反馈。当您使用后台线程时,sandhour光标不是一个选项


另一种方法是将大的请求分解成更小的部分,以便可以报告进度。

< P>除了WPF或WiFrand中的技术实现外,还有一个重要的方面要考虑。
  • 您是否从web服务获得进度反馈
否则,您可能无法正确预测web服务需要的时间。这取决于您无法影响的因素(如服务器负载、网络流量等)。在这种情况下,不建议使用进度条,因为它会给用户带来奇怪的体验

然后,您可以选择显示请求可能需要几分钟时间的文本信息,以及显示带有
isindedite
标志集(WPF)的进度,以显示持续的进度反馈。当您使用后台线程时,sandhour光标不是一个选项


另一种方法是将大请求分解为更小的部分,以便报告进度。

我刚刚整理了Adil答案的一个变体,它封装了工作和更新,并正确地分离事件和处理工作人员。如果你对我的答案投赞成票,请对阿迪尔的答案投赞成票

    private void cmdButton_Click(object sender, EventArgs e)
    {
        var worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;

        DoWorkEventHandler doWork = (dws, dwe) =>
        {
            for (int i = 0; i < 101; i++)
            {
                worker.ReportProgress(i);
                System.Threading.Thread.Sleep(100);
            }
        };

        ProgressChangedEventHandler progressChanged = (pcs, pce) =>
        {
            lblProgress.Text = String.Format("Progress: {0}%", pce.ProgressPercentage);
        };

        RunWorkerCompletedEventHandler runWorkerCompleted = null;
        runWorkerCompleted = (rwcs, rwce) =>
         {
             worker.DoWork -= doWork;
             worker.ProgressChanged -= progressChanged;
             worker.RunWorkerCompleted -= runWorkerCompleted;
             worker.Dispose();
             lblProgress.Text = "Done.";
         };

        worker.DoWork += doWork;
        worker.ProgressChanged += progressChanged;
        worker.RunWorkerCompleted += runWorkerCompleted;

        worker.RunWorkerAsync();
    }
private void cmdButton\u单击(对象发送者,事件参数e)
{
var worker=新的BackgroundWorker();
worker.WorkerReportsProgress=true;
榫头榫头榫头=(dws,dwe)=>
{
对于(int i=0;i<101;i++)
{
工人进度报告(一);
系统线程线程睡眠(100);
}
};
ProgressChangedEventHandler progressChanged=(个人电脑,个人电脑)=>
{
lblProgress.Text=String.Format(“进度:{0}%”,pce.ProgressPercentage);
};
RunWorkerCompletedEventHandler runWorkerCompleted=null;
runWorkerCompleted=(rwcs、rwce)=>
{
worker.DoWork-=DoWork;
worker.ProgressChanged-=ProgressChanged;
worker.RunWorkerCompleted-=RunWorkerCompleted;
worker.Dispose();
lblProgress.Text=“完成。”;
};
    private void cmdButton_Click(object sender, EventArgs e)
    {
        var worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;

        DoWorkEventHandler doWork = (dws, dwe) =>
        {
            for (int i = 0; i < 101; i++)
            {
                worker.ReportProgress(i);
                System.Threading.Thread.Sleep(100);
            }
        };

        ProgressChangedEventHandler progressChanged = (pcs, pce) =>
        {
            lblProgress.Text = String.Format("Progress: {0}%", pce.ProgressPercentage);
        };

        RunWorkerCompletedEventHandler runWorkerCompleted = null;
        runWorkerCompleted = (rwcs, rwce) =>
         {
             worker.DoWork -= doWork;
             worker.ProgressChanged -= progressChanged;
             worker.RunWorkerCompleted -= runWorkerCompleted;
             worker.Dispose();
             lblProgress.Text = "Done.";
         };

        worker.DoWork += doWork;
        worker.ProgressChanged += progressChanged;
        worker.RunWorkerCompleted += runWorkerCompleted;

        worker.RunWorkerAsync();
    }