Advertisement
Serginio

Untitled

Feb 15th, 2016
6,359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.83 KB | None | 0 0
  1. public partial class Form1 : Form
  2.     {
  3.         SynchronizationContext Sc;
  4.         public IAsyncEvent EventTo1C;
  5.         public Form1()
  6.         {
  7.             InitializeComponent();
  8.         // Так как у Формы уже есть Контекст то устанавливать новый контекст для потока не нужно
  9.          // В других случаях нужно установить контекст
  10.         //    SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
  11.             Sc = SynchronizationContext.Current;
  12.  
  13.         }
  14.  
  15.         private async void button1_Click(object sender, EventArgs e)
  16.         {
  17.             var ПотокПриложения = Thread.CurrentThread.ManagedThreadId;
  18.             // Для чистоты эксперимента вызовим события из потока отличного от потока приложения.
  19.             // Что бы await не использовал текущий контекст установим ConfigureAwait(false)
  20.             await Task.Delay(1000).ConfigureAwait(false); // делаем задержку в секунду и вызываем событие
  21.             var ПотокСобытия = Thread.CurrentThread.ManagedThreadId;
  22.  
  23.             // Для вызова в тотоке приложения вызовем метод из его потока
  24.             Sc.Send(d => EventTo1C.ExternalEvent("ДанныеИзТестВК", "Тест", string.Format("Поток Приложения={0} Поток события {1}",ПотокПриложения,ПотокСобытия)), null);
  25.             // Если очень быстро кликать по кнопке то потоки события будут разными
  26.         }
  27.  
  28.         private void Form1_FormClosed(object sender, FormClosedEventArgs e)
  29.         {
  30.             EventTo1C.ExternalEvent("ДанныеИзТестВК", "Тест","Окно Закрыто");
  31.             // Marshal.Release(Marshal.GetIDispatchForObject(EventTo1C));
  32.             // Marshal.ReleaseComObject(EventTo1C);
  33.             EventTo1C = null;
  34.             GC.Collect();
  35.             GC.WaitForPendingFinalizers();
  36.         }
  37.     }
  38.  
  39.  
  40.  public partial class Window1 : Window
  41.     {
  42.         dynamic Модуль1С;
  43.         public Window1(dynamic модуль1С, dynamic Object1C)
  44.         {
  45.             InitializeComponent();
  46.             Модуль1С = модуль1С;
  47.             IExtWndsSupport n;
  48.              n = (IExtWndsSupport)Object1C;
  49.              IntPtr hwnd;
  50.                     n.GetAppMainFrame(out hwnd);
  51.  
  52.             var wih = new System.Windows.Interop.WindowInteropHelper(this);
  53.             wih.Owner = hwnd;
  54.  
  55.             //Marshal.Release(Marshal.GetIDispatchForObject(Object1C));
  56.             //Marshal.ReleaseComObject(Object1C);
  57.             //Object1C = null;
  58.         }
  59.  
  60.         private void button_Click(object sender, RoutedEventArgs e)
  61.         {
  62.             Модуль1С.СообщитьСтр(textBox.Text);
  63.         }
  64.  
  65.         public static void СоздатьОкно(dynamic модуль1С, dynamic Object1C)
  66.         {
  67.             модуль1С.СообщитьСтр("Зашли в метод");
  68.             var окно = new Window1(модуль1С, Object1C);
  69.             окно.Show();
  70.             модуль1С.СообщитьСтр("Форма открыта");
  71.         }
  72.  
  73.         private void Window_Closed(object sender, EventArgs e)
  74.         {
  75.             Модуль1С.СообщитьСтр("Форма закрыта");
  76.             Marshal.Release(Marshal.GetIDispatchForObject(Модуль1С));
  77.             Marshal.ReleaseComObject(Модуль1С);
  78.             Модуль1С = null;
  79.             GC.Collect();
  80.             GC.WaitForPendingFinalizers();
  81.         }
  82.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement