从 Task.Run() 访问所有 ListView 项目会出现此错误 InvalidOperationException: 'Cross-thread operation not valid
access all ListView Items from Task.Run() gives this error InvalidOperationException: 'Cross-thread operation not valid
在我的代码中,我使用 await Task.Run 因此在将文件上传到 SFTP 时表单不会冻结
当我试图写入文本框并使用 LogUpload 函数修复它时,我遇到了类似的错误
但现在当我尝试访问 ListView 项目时出现此错误
System.InvalidOperationException: 'Cross-thread operation not valid:
Control 'lvwFiles' accessed from a thread other than the thread it was
created on.'
我想知道如何解决这个问题
这是我的代码
await Task.Run(() =>
{
using (SftpClient client = new SftpClient(host, port, username, password))
{
client.Connect();
if (client.IsConnected)
{
LogUpload("I'm connected to the client" + "\r\n");
foreach (ListViewItem item in lvwFiles.Items) //<<---- Causing the error
{
string fileName = item.SubItems[0].Text;
string uploadFile = item.SubItems[1].Text;
LogUpload 的函数是
private void LogUpload(string txt)
{
if (txtLog.InvokeRequired)
{
txtLog.Invoke(new MethodInvoker(delegate { txtLog.Text = txt + txtLog.Text; }));
}
}
发生此错误是因为您正试图从另一个线程 运行 的任务中读取 ListView 中的项目。不要读取 Task.Run 调用中的项目,而是将它们复制到 Task.Run 上面一行的数组中,然后引用该数组。
CopyTo method 提供了一种将 ListViewItems 复制到数组的简单方法。它看起来像这样:
// instantiate new array to hold copy of items
var copyOfItems = new ListViewItems[lvwFiles.Items.Count];
// copy items
lvwFiles.Items.CopyTo(copyOfItems, 0);
现在只需在您的任务中引用 copyOfItems
!
在我的代码中,我使用 await Task.Run 因此在将文件上传到 SFTP 时表单不会冻结
当我试图写入文本框并使用 LogUpload 函数修复它时,我遇到了类似的错误
但现在当我尝试访问 ListView 项目时出现此错误
System.InvalidOperationException: 'Cross-thread operation not valid: Control 'lvwFiles' accessed from a thread other than the thread it was created on.'
我想知道如何解决这个问题
这是我的代码
await Task.Run(() =>
{
using (SftpClient client = new SftpClient(host, port, username, password))
{
client.Connect();
if (client.IsConnected)
{
LogUpload("I'm connected to the client" + "\r\n");
foreach (ListViewItem item in lvwFiles.Items) //<<---- Causing the error
{
string fileName = item.SubItems[0].Text;
string uploadFile = item.SubItems[1].Text;
LogUpload 的函数是
private void LogUpload(string txt)
{
if (txtLog.InvokeRequired)
{
txtLog.Invoke(new MethodInvoker(delegate { txtLog.Text = txt + txtLog.Text; }));
}
}
发生此错误是因为您正试图从另一个线程 运行 的任务中读取 ListView 中的项目。不要读取 Task.Run 调用中的项目,而是将它们复制到 Task.Run 上面一行的数组中,然后引用该数组。
CopyTo method 提供了一种将 ListViewItems 复制到数组的简单方法。它看起来像这样:
// instantiate new array to hold copy of items
var copyOfItems = new ListViewItems[lvwFiles.Items.Count];
// copy items
lvwFiles.Items.CopyTo(copyOfItems, 0);
现在只需在您的任务中引用 copyOfItems
!