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”相对应的参数“我还将查看您提供的链接。