[英]Why I'm getting exception: InvalidOperationException?
例外是代碼:
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));
}
}
在線上:
adJob.ProgressBar.Invoke((Action)(() => adJob.ProgressBar.Value = e.ProgressPercentage));
這是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());
}
}
}
我不確定我是否需要調用此行,因為我現在不使用背景工作者,但我不確定。
這是完整的異常消息:在創建窗口句柄之前,無法在控件上調用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:
如何在不使用Invoke的情況下更改此行,或者如果需要Invoke,我該如何修復該行和異常?
我知道我應該在Form1表格結束活動中處理它但是如何處理? 我應該在form1表格結束活動中做些什么?
是的,你得到一個例外,因為Invoke
需要將“Message”發布到“Message loop”但是還沒有創建Handle
。
使用InvokeRequired
查看是否需要Invoke
,當還沒有創建Handle時,這將返回false,因此直接調用它。
var method = (Action)(() => adJob.ProgressBar.Value = e.ProgressPercentage);
if(adJob.ProgressBar.InvokeRequired)
adJob.ProgressBar.Invoke(method);
else
method();
問題是您嘗試在具有窗口句柄之前修改進度條。 解決它的一種方法是:
if (adJob.ProgressBar.Handle != IntPtr.Zero)
{
adJob.ProgressBar.Invoke((Action)(() =>
adJob.ProgressBar.Value = e.ProgressPercentage));
}
這可能是因為您在實際顯示Form
之前調用此方法。
試試吧:
MethodInvoker mi = () => adJob.ProgressBar.Value = e.ProgressPercentage;
if(InvokeRequired) BeginInvoke(mi);
else mi();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.