C# 线程安全问题:跨线程操作无效

C# 线程安全问题:跨线程操作无效,c#,datagridview,thread-safety,C#,Datagridview,Thread Safety,我正在尝试在设备上侦听,当从该设备收到一条消息时,首先在datagridview上显示该消息,但从该设备获得的消息工作正常,但问题是,当我要设置DGV内容时,我得到的此异常跨线程操作无效,并且我已阅读了相关主题。 但是,由于没有绑定DGV,它们都没有帮助。 这是我的密码: 1.首先,我有一个绑定到DGV的消息类 public class Msg_log { public Msg_log() { this.Event = null; this.Ope

我正在尝试在设备上侦听,当从该设备收到一条消息时,首先在datagridview上显示该消息,但从该设备获得的消息工作正常,但问题是,当我要设置DGV内容时,我得到的此异常跨线程操作无效,并且我已阅读了相关主题。
但是,由于没有绑定DGV,它们都没有帮助。
这是我的密码: 1.首先,我有一个绑定到DGV的消息类

public class Msg_log
{
    public Msg_log()
    {
        this.Event = null;
        this.Operator = null;
    }
    public string Event { get; set; }
    public string Operator { get; set; }
}
下面是如何在loadform事件中创建另一个线程:

newThread = new System.Threading.Thread(this.Event_Listener);
        newThread.Start();   
在事件侦听器函数中

                x.Add(message);
                MsgDGV.DataSource = null;
                MsgDGV.DataSource = x;
                MsgDGV.Refresh();
消息对象如下所示:

Msg_log message = new Msg_log();
消息的事件和操作符变量设置正确,我将MSG.DataSource=null,因为我想在新消息提交后更新我的DGV(实际上这是我的想法,如果有更好的方法,我将不胜感激),这就是我得到的一行exeption:Cross thread operation not valid。在其他帖子中,我发现我应该使用Invoke方法,但我不知道如何调用Msg_DGV.Invoke(?,?);我不知道我应该通过什么来获得正确的结果…

干杯,

如果您确实希望执行与链接到的帖子相同的操作,只需将控件更改为使用DataGridView即可

一个不使用动作的更全面的例子

// The declaration of the textbox.
private TextBox m_TextBox;

// Updates the textbox text.
private void UpdateText(string text)
{
  // Set the textbox text.
  m_TextBox.Text = text;
}

//Now, create a delegate that has the same signature as the method that was previously defined:
public delegate void UpdateTextCallback(string text);

//In your thread, you can call the Invoke method on m_TextBox, 
//passing the delegate to call, as well as the parameters.
m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText), 
            new object[]{”Text generated on non-UI thread.”});

你可以用BackgroundWorker

var bw = new BackgroundWorker();
bw.DoWork += (s, e) => {
                         ...
                         x.Add(message);
                         ...
                         e.Result = x;
                       };
bw.RunWorkerCompleted += (s, e) => MsgDGV.DataSource = e.Result;
bw.RunWorkerAsync();

创建一个方法来处理设置DGV数据源和刷新DGV,并调用MsgDGV.Invoke(myDelegate,vnew Object[]{x});我把它做成这样,这有助于我思考:)动作show_DGV=delegate(){MsgDGV.DataSource=null;MsgDGV.DataSource=x;MsgDGV.Refresh();};this.MsgDGV.Invoke(showdgv);
var bw = new BackgroundWorker();
bw.DoWork += (s, e) => {
                         ...
                         x.Add(message);
                         ...
                         e.Result = x;
                       };
bw.RunWorkerCompleted += (s, e) => MsgDGV.DataSource = e.Result;
bw.RunWorkerAsync();