C # Многопоточность по событиям

Я создаю программу, в которой вызываются события. Вот код

public void Form1_Load(Object sender, EventArgs e)
{
      Thread thread = new Thread(new ThreadStart(getData));
      thread.IsBackground = true;
      thread.Start();
      Thread.CurrentThread.Name = "Main";
}
private void getData()
{
       try
       {
            int count = 1;
            opcServer.Connect("OPCTechs.SiemensNet30DA", "");
            Thread.CurrentThread.Name = "Child";

            opcGroup = opcServer.OPCGroups.Add("MP");
            opcGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGroup_DataChange);

            //Get First String
            for (int i = 40; i <= 47; i++)
                opcGroup.OPCItems.AddItem("D104.B" + i, count++);

            //Get Second String
            for (int i = 80; i <= 91; i++)
                opcGroup.OPCItems.AddItem("D104.B" + i, count++);

            opcGroup.OPCItems.DefaultIsActive = true;
            opcGroup.UpdateRate = 1000;
            opcGroup.IsSubscribed = opcGroup.IsActive;
      }
      catch (Exception exc)
      {
                 MessageBox.Show(exc.Message, "Alert");
      }
}
private void opcGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
     try
     {
            MessageBox.Show(Thread.CurrentThread.Name,"Alert");
            string temp = "";
            int count = 1;
            for (count = 1; count <= NumItems; count++)
            {
               if (Convert.ToInt32(ClientHandles.GetValue(count)) == 47)
                    temp += ItemValues.GetValue(count).ToString();
            }
            Textbox1.Text = temp.ToString();
            temp = "";
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message, "Alert");
        }
}

В этом синтаксисе MessageBox.Show(Thread.CurrentThread.Name,"Alert"); я ожидал показать Child, поскольку он вызывается из дочернего потока, но он показывает Main. Почему событие выполняется в основном потоке, но не в дочернем потоке?


person Harshit    schedule 25.09.2015    source источник
comment
что произойдет, если вы удалите Thread.CurrentThread.Name = "Main"; из Form1_Load   -  person Mohit Shrivastava    schedule 25.09.2015
comment
@siride нет, я просто недостаточно внимательно посмотрел.   -  person phoog    schedule 25.09.2015
comment
Вы запускаете случайный поток, а затем просто случайным образом даете ему имя, я не думаю, что вы знаете, что делаете   -  person Xogle    schedule 25.09.2015
comment
Взгляните на этот tutorialspoint.com/csharp/csharp_multithreading.htm   -  person Xogle    schedule 25.09.2015
comment
Что произойдет, если вы поместите MessageBox.Show() в свой getData() метод? Показывает ли он что-то отличное от того, что показано, если этот вызов находится внутри вашего метода события? Возможно, событие запускается в основном потоке пользовательского интерфейса. Это действительно зависит от того, что библиотека, которую вы используете, делает с событием.   -  person siride    schedule 25.09.2015
comment
Да, я поместил Messagebox чуть ниже Thread.CurrentThread.Name = "Child";, и он показал Child.   -  person Harshit    schedule 25.09.2015
comment
Можете ли вы поставить точку останова в обработчике событий и посмотреть в окно потоков, чтобы узнать, в каком потоке он выполняется?   -  person siride    schedule 25.09.2015
comment
@siride, в окошке ветки в поле Name показывает написано Main.   -  person Harshit    schedule 25.09.2015
comment
@HarshitShrivastava: тогда кажется, что используемая вами библиотека, вероятно, вызывает обработчик событий в потоке пользовательского интерфейса. Вам нужно будет изучить это (я не знаю, владеете ли вы кодом или сторонним).   -  person siride    schedule 25.09.2015
comment
Да, я использую Interop.OPCAutomation.dll библиотеку. Есть ли способ вызвать его в отдельном потоке, поскольку события запускаются за секунды, я не хочу, чтобы моя основная форма зависала.   -  person Harshit    schedule 25.09.2015
comment
Вы всегда можете поместить информацию о вашем событии в общую очередь, которая читается фоновым потоком. Событие быстро загрузит очередь, а затем вернется.   -  person siride    schedule 25.09.2015
comment
Ознакомьтесь с этим вопросом SO. Два основных ответа могут помочь объяснить, что происходит   -  person amura.cxg    schedule 25.09.2015
comment
@ amura.cxg, я поместил OPCAutomation.OPCGroup opcGroup внутрь метода getData(), как читал по вашей ссылке. Теперь кажется, что он работает в отдельном потоке, но теперь он также не показывает Child в окне сообщения, но показывает пустое значение.   -  person Harshit    schedule 25.09.2015