public partial class Form1 : Form
{
SynchronizationContext Sc;
public IAsyncEvent EventTo1C;
public Form1()
{
InitializeComponent();
// Так как у Формы уже есть Контекст то устанавливать новый контекст для потока не нужно
// В других случаях нужно установить контекст
// SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
Sc = SynchronizationContext.Current;
}
private async void button1_Click(object sender, EventArgs e)
{
var ПотокПриложения = Thread.CurrentThread.ManagedThreadId;
// Для чистоты эксперимента вызовим события из потока отличного от потока приложения.
// Что бы await не использовал текущий контекст установим ConfigureAwait(false)
await Task.Delay(1000).ConfigureAwait(false); // делаем задержку в секунду и вызываем событие
var ПотокСобытия = Thread.CurrentThread.ManagedThreadId;
// Для вызова в тотоке приложения вызовем метод из его потока
Sc.Send(d => EventTo1C.ExternalEvent("ДанныеИзТестВК", "Тест", string.Format("Поток Приложения={0} Поток события {1}",ПотокПриложения,ПотокСобытия)), null);
// Если очень быстро кликать по кнопке то потоки события будут разными
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
EventTo1C.ExternalEvent("ДанныеИзТестВК", "Тест","Окно Закрыто");
// Marshal.Release(Marshal.GetIDispatchForObject(EventTo1C));
// Marshal.ReleaseComObject(EventTo1C);
EventTo1C = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
public partial class Window1 : Window
{
dynamic Модуль1С;
public Window1(dynamic модуль1С, dynamic Object1C)
{
InitializeComponent();
Модуль1С = модуль1С;
IExtWndsSupport n;
n = (IExtWndsSupport)Object1C;
IntPtr hwnd;
n.GetAppMainFrame(out hwnd);
var wih = new System.Windows.Interop.WindowInteropHelper(this);
wih.Owner = hwnd;
//Marshal.Release(Marshal.GetIDispatchForObject(Object1C));
//Marshal.ReleaseComObject(Object1C);
//Object1C = null;
}
private void button_Click(object sender, RoutedEventArgs e)
{
Модуль1С.СообщитьСтр(textBox.Text);
}
public static void СоздатьОкно(dynamic модуль1С, dynamic Object1C)
{
модуль1С.СообщитьСтр("Зашли в метод");
var окно = new Window1(модуль1С, Object1C);
окно.Show();
модуль1С.СообщитьСтр("Форма открыта");
}
private void Window_Closed(object sender, EventArgs e)
{
Модуль1С.СообщитьСтр("Форма закрыта");
Marshal.Release(Marshal.GetIDispatchForObject(Модуль1С));
Marshal.ReleaseComObject(Модуль1С);
Модуль1С = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}