Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# 尝试向form1 backgroundworker报告类的进度时尚未工作。是什么让程序挂起的?_C#_.net_Winforms - Fatal编程技术网

C# 尝试向form1 backgroundworker报告类的进度时尚未工作。是什么让程序挂起的?

C# 尝试向form1 backgroundworker报告类的进度时尚未工作。是什么让程序挂起的?,c#,.net,winforms,C#,.net,Winforms,问题是当我运行程序并在类中放置断点时: ProgressChanged?.DynamicInvoke(new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, StateText = cc }); ProgressChanged?.DynamicInvoke(new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, Stat

问题是当我运行程序并在类中放置断点时:

ProgressChanged?.DynamicInvoke(new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, StateText = cc });
ProgressChanged?.DynamicInvoke(new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, StateText = cc });
ei.ProgressChanged += (senders, eee) => backgroundWorker1.ReportProgress(eee.Percentage, e);
它停在这条线上,但我让它继续,它不再到达那里,程序只是挂起,什么也不做。我没有任何例外

在课堂上:

public class ProgressEventArgs : EventArgs
        {
            public int Percentage { get; set; }
            public string StateText { get; set; }
        }

        public event EventHandler<ProgressEventArgs> ProgressChanged;

        public void Init()
        {
            int index = 0;
            ExtractCountires();
            foreach (string cc in countriescodes)
            {
                // raise event here
                ProgressChanged?.DynamicInvoke(new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, StateText = cc });
                ExtractDateAndTime("http://www.sat24.com/image2.ashx?region=" + cc);
                index++;
            }
            ImagesLinks();
        }
在Form1 backgroundworker事件中:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            if (backgroundWorker1.CancellationPending == true)
            {
                e.Cancel = true;
                return; // this will fall to the finally and close everything    
            }
            else
            {
                ExtractImages ei = new ExtractImages();
                ei.ProgressChanged += (senders, eee) => backgroundWorker1.ReportProgress(eee.Percentage, e);
                ei.Init();
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            ProgressBar1.Value = e.ProgressPercentage;
        }
我需要做一些更改,否则我会出错:

在在线课程中:

ProgressChanged?.DynamicInvoke(new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, StateText = cc });
ProgressChanged?.DynamicInvoke(new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, StateText = cc });
ei.ProgressChanged += (senders, eee) => backgroundWorker1.ReportProgress(eee.Percentage, e);
它是ProgressChanged?.Invoke,但我在调用时出错,只有当我将其更改为DynamicInvoke时,我才没有出错

在表格1中:

在线:

ProgressChanged?.DynamicInvoke(new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, StateText = cc });
ProgressChanged?.DynamicInvoke(new ProgressEventArgs{ Percentage = 100 * index / countriescodes.Count, StateText = cc });
ei.ProgressChanged += (senders, eee) => backgroundWorker1.ReportProgress(eee.Percentage, e);

它是sender,e,但由于事件中sender和e已经存在,我不得不将其更改为senders和eee。

我在调试器中遇到了类似的问题。试试这个。我知道调试器在不同的场景中挂起很多,可以通过您的设置VS>Tools>Options>debug来修复


如果您不知道这些选项的具体用途,请仔细阅读

如果您在设计时知道所有类型(这里就是这种情况),那么应该使用Invoke。请关注您在使用Invoke时所说的错误。使用Inovke时的错误是:严重性代码描述项目文件行抑制状态错误CS7036没有给出与EventHandler.Invoke(object,ExtractImages.ProgressEventArgs)的必需形式参数“e”相对应的参数如果我加上一行:objectobj=null,它几乎可以正常工作;然后在Invoke:ProgressChanged?.Invoke(obj,newprogresseventargs{Percentage=100*index/countriescodes.Count,StateText=cc})的行中添加obj变量;但是form1中的progressBar1并没有结束,它在结束之前停止了一点,大约90-95%。我还看到现在我无法从类中获取StateText。在类中,我做到了:ProgressChanged?.Invoke(obj,newprogresseventargs{Percentage=100*index/countriescodes.Count,StateText=cc});然后在form1 dowork事件中:ei.ProgressChanged+=(senders,eee)=>backgroundWorker1.ReportProgress(eee.Percentage,eee);然后在progresschanged事件中:label7.Text=e.UserState.ToString();但是它没有在label7中显示cc,但是ProgressEventArgsOk我解决了StateText的问题,它现在正在工作。我在类中的列表中对它进行了检查,直到最后一个StateText(cc)的结尾。但是,mbar1项目并没有达到100%,而是达到了90-95%。是否应添加已完成的事件:progressBar1.Value=100;或者是我在类中进行的计算有问题?使用Invoke时遇到的错误是:严重性代码描述项目文件行抑制状态错误CS7036没有给出与EventHandler.Invoke(object,ExtractImages.ProgressEventArgs)的必需形式参数“e”相对应的参数“我还将查看您提供的链接。