【发布时间】:2020-02-05 05:38:46
【问题描述】:
我正在尝试FileTransferManager 库,它用于传输文件/文件夹。 当我在复制过程中关闭表单时有时会出现以下错误:
无法访问已处置的对象。对象名称:'formMain'。
正如我之前提到的奇怪的部分,我并不总是得到这个错误。有时,表单会毫无问题地关闭。
我试图检查 formMain 在错误发生时是否真的使用this.IsDisposed 进行了处理,但它总是返回false。我什至试图将该支票放在委托中,但没有帮助。
这是 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 DirCopyTest.formMain.SetProgressBarValue(ProgressBar progressBar, Int32 val) in C:\Users\me\Documents\Visual Studio 2019\Projects\FileTransferManagerDemo\formMain.cs:line 73
at DirCopyTest.formMain.TransferProgressChanged(TransferProgress tp) in C:\Users\me\Documents\Visual Studio 2019\Projects\FileTransferManagerDemo\formMain.cs:line 60
at IOExtensions.FileTransferManager.<>c__DisplayClass7_0.<CopyFileWithProgress>b__0(Int64 size, Int64 transferred, Int64 streamSize, Int64 bytesTransferred, UInt32 number, CopyProgressCallbackReason reason, IntPtr file, IntPtr destinationFile, IntPtr data)
这是导致错误的特定行:
Invoke(new SetProgressBarCallback(SetProgressBarValue), new object[] { progressBar, val });
这是完整的代码:
CancellationTokenSource canceller;
private async void buttonCopy_Click(object sender, EventArgs e)
{
canceller = new CancellationTokenSource();
Action<TransferProgress> progress = new Action<TransferProgress>(TransferProgressChanged);
await FileTransferManager.CopyWithProgressAsync(source, destination, progress, canceller.Token, false, true);
}
void TransferProgressChanged(TransferProgress tp)
{
if (!canceller.IsCancellationRequested)
SetProgressBarValue(progressBar1, (int)tp.Percentage);
}
delegate void SetProgressBarCallback(ProgressBar progressBar, int val);
private void SetProgressBarValue(ProgressBar progressBar, int val)
{
if (progressBar.InvokeRequired)
Invoke(new SetProgressBarCallback(SetProgressBarValue), new object[] { progressBar, val });
else
progressBar.Value = val;
}
private void formMain_FormClosing(object sender, FormClosingEventArgs e)
{
canceller.Cancel();
}
【问题讨论】:
-
“我试图检查 formMain 是否真的使用 this.IsDisposed 进行了处理” - 你在哪里检查的?在
else?还是在你之前Invoke? -
@John 我在这两种情况下都试过了,但都没有帮助。
标签: c# winforms async-await delegates