gpt4 book ai didi

c# - 标签上的 "Invoke or BeginInvoke cannot be called on a control until"

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:32 25 4
gpt4 key购买 nike

我已经阅读了几个与此问题相关的问题/答案,但找不到适用于该问题的解决方案。

我有一个表单 (MainForm) 和一个按钮 (Upload)。当我单击按钮时(从 ComboBox 选择要上传到服务器的文件后),它会打开另一个表单 (UploadBackupForm) 并将文件上传到服务器。上传过程在 UploadBackupForm 中控制,表单如下所示:

Screenshot from the app

只要上传完成一次,它就可以工作,我的意思是,UploadBackupForm 被调用一次。我第二次单击“上传”按钮时,UploadBackupForm 打开并且(在上传一些数据之后)它抛出一条错误消息:

System.InvalidOperationException: 'Invoke or BeginInvoke cannot be called on a control until the window handle has been created.'

在此特定行:

DurationLabel.Invoke((MethodInvoker)delegate
{
DurationLabel.Text = Count2Duration(count);
});

这让我感到困惑,因为它在完成一次时有效,而在第二次时无效。我有 C# 的基础知识,所以我不知道是什么原因造成的,也不知道如何解决。

主窗体:

private void Upload2ServerButton_OnClick(object sender, EventArgs e)
{
Form UBF = new UploadBackupForm();
UBF.ShowDialog();
}

上传备份表单:

public partial class UploadBackupForm : Form
{
public UploadBackupForm()
{
InitializeComponent();
}

public static System.Timers.Timer timer = new System.Timers.Timer();
public static int count = 0;

private void UploadBackup_Load(object sender, EventArgs e)
{
timer.Interval = 1000;

timer.Elapsed += new ElapsedEventHandler(delegate {
count++;
// didn't do any good (this.IsHandleCreated or DurationLabel.IsHandleCreated)
// if (!this.IsHandleCreated)
// {
// this.CreateControl();
// }
DurationLabel.Invoke((MethodInvoker)delegate
{
DurationLabel.Text = Count2Duration(count);
});
});

// upload the archive to the server
new Thread((ThreadStart)delegate
{
FTP.Item[] items = FTP.ListDirectoryDetails(DataIO.FTP.Server, DataIO.FTP.Username, DataIO.FTP.Password, DataIO.FTP.UploadDir);

// here, I upload the file to the server and update the progress bar and the uploaded / total labels

最佳答案

因为 timer 变量是静态的,即使在表单关闭后它仍然存在。它包含对委托(delegate)的引用,该委托(delegate)持有对表单的引用,因此以前的实例在应用程序的整个生命周期中都保持事件状态。此外,单个 timer 将回调发送到所有先前实例以及当前实例。

正如正确指出的那样 in the comments通过 Evk , 使 timercount 成为非静态的,以便它们专用于表单的每个实例。

关于c# - 标签上的 "Invoke or BeginInvoke cannot be called on a control until",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49606928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com