Потому что я не могу поймать RaceOnRCWCleanup
и потому, что знаю, что я грязно программирую использование COM-объектов из нескольких потоков без дополнительной безопасности. Мне нужно задать вопрос:Действия в очереди для простого класса потоков?
Вопрос: Как разрешить другим потокам помещать рабочие элементы/действия в рабочий поток (например, Invoke/BeginInvoke for Control)? В принципе, другой поток должен быть способен сообщить MyThread
«Сделай это! Сделай это!» и do no действие вместо MyThread
.
Мне также нужно использовать параметры и вернуть значения. Ресурсы (COM-объекты) должны использоваться только одним потоком. Я думал о создании очереди для перечисления действий для выполнения, но я не понимаю, как добавлять параметры и т. Д. Мой первый дизайн выглядит как код ниже.
Редактировать: Для меня также важно, чтобы объект нити был простой снаружи. Поэтому я хочу назвать метод вроде
myThread.Connect();
, не задумываясь о каких-либо делегатах и других вещах. Объект потока должен использовать делегаты или другие методы в фоновом режиме. На данный момент я использую очередь с дополнительным классом, в котором хранятся вызванный метод, параметры, а затем результат. Результаты доставляются через «завершенное событие». Я не думаю, что это хороший способ оставить это так, потому что все вызовы «действия» в потоке асинхронны.
public class MyThread
{
// private
private enum MyEnum { Connect, Disconnect }
private Queue<MyEnum> queue = new Queue<MyEnum>();
private void Run()
{
// loops, does work and can regularly check a queue
}
// public
public void Connect(string address, int parameter1, object parameter2)
{
// triggers connection to a db or somthing similar
// internally it queues an action for this thread to perform
}
public object Disconnect()
{
// triggers disconnect from a db or something similar
// internally it queues an action for this thread to perform
// but must wait for result
}
public void Start()
{
// starts the thread
}
public void Stop()
{
// stops the thread
}
}
Что вы ищете производитель - механизм Потребители, где данные хранятся будут ваши действия должны быть приняты в потоке. https://msdn.microsoft.com/en-us/library/hh228601%28v=vs.110%29.aspx – matcheek