Проблема безопасности потока: операция поперечного потока недопустима - PullRequest
0 голосов
/ 10 января 2012

Я пытаюсь прослушать устройство, и когда я получил сообщение от этого, показывающее его на сетке данных первым, но получение сообщения от устройства работает отлично, но проблема в том, что когда я хочу установить содержимое 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();   

и в Event_Listenerfunction

                x.Add(message);
                MsgDGV.DataSource = null;
                MsgDGV.DataSource = x;
                MsgDGV.Refresh();

объект сообщения выглядит следующим образом:

Msg_log message = new Msg_log();

и его переменные Event и Operator сообщения установлены правильно, и я поставил MSG.DataSource = null, посколькуЯ хочу обновить свой DGV после прихода нового сообщения (на самом деле это была моя идея, и если бы был какой-то лучший способ для этого, я был бы признателен за это), и вот строка, которую я получил за исключением:Перекрестная операция недопустима.В других постах я узнал, что мне следует использовать метод Invoke, но я не знаю, как вызвать Msg_DGV.Invoke (??, ???);Я не знаю, что я должен перейти к этому, чтобы получить правильный результат ...
Ура,

Ответы [ 2 ]

1 голос
/ 10 января 2012

Вы можете просто использовать 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();
1 голос
/ 10 января 2012

Вы хотите сделать то же самое, что и сообщение, на которое вы ссылались, просто измените свой элемент управления на использование DataGridView. C # Проблемы с темой

Msg_DGV.Invoke(new Action( () => Msg_DGV.DataSource = null ) );

Более полный пример из здесь , который не использует Actions.

// 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.”});
...