C# 在C中从连续运行的线程中提取数据#

C# 在C中从连续运行的线程中提取数据#,c#,multithreading,datagridview,udpclient,C#,Multithreading,Datagridview,Udpclient,我正在进行一个项目,该项目持续侦听UDP端口514(syslog)上的数据包。当收到一个数据包时,我需要解析消息,以便它可以显示在DataGridView控件的主窗体上 我有它,所以它会用新消息更新DataGridView,但我可以从防火墙中获得100多条相同的syslog消息,因此我想搜索我的dataGrid,查看消息是否已经存在,然后更新“命中计数”列,而不是为重复消息创建新行 问题是我不知道如何在foreach循环中调用我的DataGridView。我不是从线程返回值,而是在处理数据,所以

我正在进行一个项目,该项目持续侦听UDP端口514(syslog)上的数据包。当收到一个数据包时,我需要解析消息,以便它可以显示在DataGridView控件的主窗体上

我有它,所以它会用新消息更新DataGridView,但我可以从防火墙中获得100多条相同的syslog消息,因此我想搜索我的dataGrid,查看消息是否已经存在,然后更新“命中计数”列,而不是为重复消息创建新行

问题是我不知道如何在foreach循环中调用我的DataGridView。我不是从线程返回值,而是在处理数据,所以我需要从UI线程调用DataGridView控件

到目前为止,我的代码是:

private async void Form1_Load(object sender, EventArgs e)
{
    var udpCap = await Task.Run(() => captureSyslog());
}
public async Task<string> captureSyslog()
{
    var listener = new UdpClient(514, AddressFamily.InterNetwork);
    var ep = default(IPEndPoint);
    while (true)
    {
        try
        {                    
            var data = listener.Receive(ref ep);
            string incomingSyslog = Encoding.ASCII.GetString(data);
            outputMessage(incomingSyslog);
        }
        catch (Exception ex2)
        {
            outputMessage(ex2.ToString());
        }
    }
}
private void outputMessage(string txt)
{
    string[] chopped = txt.Split(',');
    string descrip = chopped[32];
    string severity = chopped[34];
    string paloalto = chopped[59];
    int rowIndex = -1;
    foreach (DataGridViewRow row in syslogOutput.Rows)
    {
        try
        {
            if (row.Cells[2].Value.ToString().Equals(descrip) | row.Cells[1].Value.ToString().Equals(paloalto))
            {
                //Code to update DataGridView
            }
        }
        catch (Exception ex3){ debugLabel1.Invoke(new Action(() => debugLabel1.Text = ex3.ToString()));}
    }
    if (syslogOutput.InvokeRequired)
    {
        syslogOutput.Invoke(new Action(() => syslogOutput.Rows.Add("1", chopped[59], chopped[34], chopped[32])));
    }
}
非常感谢此线程建议使用UserState传递字符串:

namespace ASA_SyslogCapture
{
    public partial class Form1 : Form
    {
        BackgroundWorker bgWorker;
        public Form1()
        {
            InitializeComponent();
            bgWorker = new BackgroundWorker();
            bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
            bgWorker.WorkerReportsProgress = true;
        }
        private async void Form1_Load(object sender, EventArgs e)
        {
            bgWorker.RunWorkerAsync();
        }
        void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //put udp code here
            var listener = new UdpClient(514, AddressFamily.InterNetwork);
            var ep = default(IPEndPoint);
            while (true)
            {
                try
                {
                    var data = listener.Receive(ref ep);
                    string incomingSyslog = Encoding.ASCII.GetString(data);
                    bgWorker.ReportProgress(0,incomingSyslog);
                }
                catch (Exception ex2) { debugLabel1.Text = ex2.ToString(); }
            }            
        }
        void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            debugLabel1.Text = e.UserState as String; //this will eventually be my datagridview code            
        }        
    }
}