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表格结束活动中做些什么?
是的,你得到一个例外,因为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)
| 归档时间: |
|
| 查看次数: |
5487 次 |
| 最近记录: |