从 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