首页 > 解决方案 > 尝试从任务 C# 更新 WinForm 应用程序中的 ListView

问题描述

我在更新 C# WinForm 上的 ListView 时遇到问题。该应用程序是一个连接到 TCP 服务器并接收数据流的测试工具。然后,测试工具将用于创建到服务器的多个连接以进行负载测试。使用以下命令启动每个任务,其中在表单中输入任务数:

for (int i = 0; i < noTasks; i++)
{
    bool saveAudio = noTasksCheckedListBox.GetItemCheckState(i) == CheckState.Checked; // true : false;
    taskArray[i] = Task.Run(() => SendMessage((initId + i).ToString(), saveAudio, audioServerIP));
}

SendMessage 函数创建 TCP 客户端连接并创建 AsyncCallBack 来处理传入流。

void SendMessage(string id, bool saveWav, string serverIP)
{
    TcpClient tcpclientAudio = new TcpClient();
    string message = "GET /msg?id=" + id + "&type=0 HTTP/1.1\r\n";

    NetworkObject audioObj = new NetworkObject
    {
        tcp = tcpclientAudio,
        ConnectionType = FileType.Audio,
        URL = message
    };

    if (saveWav)
    {
        tcpclientAudio.BeginConnect(IPAddress.Parse(serverIP), 8008, new AsyncCallback(CallBackConnectMethod01), audioObj);
    }
    else
    {
        tcpclientAudio.BeginConnect(IPAddress.Parse(serverIP), 8008, new AsyncCallback(CallBackConnectMethod02), audioObj);
    }
}

CallBackConnctMethod 的唯一区别是 02 将数据保存到文件中。

void CallBackConnectMethod02(IAsyncResult result)
{
    NetworkObject obj = (NetworkObject)result.AsyncState;
    TcpClient tcp = obj.tcp;
    NetworkStream ns = tcp.GetStream();

    startedProcessCount++;
    int thisTask = startedProcessCount;
    byte[] buffer = new byte[2048];
    string message = obj.URL;
    byte[] request = Encoding.ASCII.GetBytes(message);
    ns.Write(request, 0, request.Length);
    ns.Read(buffer, 0, 1000);
    RefreshTable(thisTask, "Incoming", null);
    ......
}

当调试应用程序进入 RefreshTable 函数时,当它进入委托部分时消失。

private void RefreshTable(int taskNo, string status, string misc)
{
    if (this.tasksListView.InvokeRequired)
    {
        this.Invoke((MethodInvoker) delegate { 
            DateTime nowDateTime = DateTime.Now;
            string now = nowDateTime.Year.ToString("D4") + nowDateTime.Month.ToString("D2") + nowDateTime.Day.ToString("D2") + "-" + nowDateTime.Hour.ToString("D2") + nowDateTime.Minute.ToString("D2") + nowDateTime.Second.ToString("D2");
            string taskId = "Task-" + taskNo.ToString("D3");

            if (status == "Incoming")
            {
                ListViewItem taskLVI = tasksListView.Items.Add(taskId);
                taskLVI.SubItems.Add(now);
                taskLVI.SubItems.Add(" ");
                taskLVI.SubItems.Add(" ");
                if (string.IsNullOrEmpty(misc))
                    taskLVI.SubItems.Add(" ");
                else
                    taskLVI.SubItems.Add(misc);
                taskLVI.SubItems.Add(" ");
            }
            else
            {
                switch (status)
                {
                    case "Lost":
                    case "Completed":
                    case "Exception":
                        ListViewItem listViewItem = null;
                        for (int i = 0; i < tasksListView.Items.Count; i++)
                        {
                            if (tasksListView.Items[i].SubItems[0].Text == taskId)
                            {
                                listViewItem = tasksListView.Items[i];
                                break;
                            }
                        }

                        if (listViewItem != null)
                            ToListViewItem(listViewItem, status, misc, now);
                        break;
                    default:
                        break;
                }
            }
            tasksListView.Refresh();
        });
    }
}

标签: c#

解决方案


推荐阅读