为什么我得到异常:InvalidOperationException?

Dor*_*zar 4 c# invoke winforms

例外是代码:

private void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e)
{
   ActiveDownloadJob adJob = e.UserState as ActiveDownloadJob;
   if (adJob != null && adJob.ProgressBar != null)
   {
      adJob.ProgressBar.Invoke((Action)(() => adJob.ProgressBar.Value = e.ProgressPercentage));
   }
}
Run Code Online (Sandbox Code Playgroud)

在线上:

adJob.ProgressBar.Invoke((Action)(() => adJob.ProgressBar.Value = e.ProgressPercentage));
Run Code Online (Sandbox Code Playgroud)

这是form1中的ActiveDownloadJob类:

class ActiveDownloadJob
{
            public DownloadImages.DownloadData DownloadData;
            public ProgressBar ProgressBar;
            public WebClient WebClient;

            public ActiveDownloadJob(DownloadImages.DownloadData downloadData, ProgressBar progressBar, WebClient webClient)
            {
                try
                {
                    this.DownloadData = downloadData;
                    this.ProgressBar = progressBar;
                    this.WebClient = webClient;
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.ToString());
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

我不确定我是否需要调用此行,因为我现在不使用背景工作者,但我不确定.

这是完整的异常消息:在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke

System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
  Source=System.Windows.Forms
  StackTrace:
       at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
       at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
       at System.Windows.Forms.Control.Invoke(Delegate method)
       at WeatherMaps.Form1.DownloadProgressCallback(Object sender, DownloadProgressChangedEventArgs e) in d:\C-Sharp\WeatherMaps\WeatherMaps\WeatherMaps\Form1.cs:line 290
       at System.Net.WebClient.OnDownloadProgressChanged(DownloadProgressChangedEventArgs e)
       at System.Net.WebClient.ReportDownloadProgressChanged(Object arg)
  InnerException: 
Run Code Online (Sandbox Code Playgroud)

如何在不使用Invoke的情况下更改此行,或者如果需要Invoke,我该如何修复该行和异常?

我知道我应该在Form1表格结束活动中处理它但是如何处理?我应该在form1表格结束活动中做些什么?

Sri*_*vel 5

是的,你得到一个例外,因为Invoke需要将"消息"发布到"消息循环"但Handle尚未创建.

使用InvokeRequired就看你是否需要Invoke,当手柄不会创建又那么直接调用它,这将返回false.

var method = (Action)(() => adJob.ProgressBar.Value = e.ProgressPercentage);
if(adJob.ProgressBar.InvokeRequired)
    adJob.ProgressBar.Invoke(method);
else
    method();
Run Code Online (Sandbox Code Playgroud)