【发布时间】:2015-05-28 20:17:01
【问题描述】:
因为我无法捕获RaceOnRCWCleanup,并且因为我知道我在没有额外安全性的情况下使用来自多个线程的 COM 对象进行脏编程。我需要问:
问题:如何允许其他线程将工作项/操作排入我的工作线程(如 Invoke/BeginInvoke for Control)?基本上另一个线程应该能够告诉MyThread“做这个!做那个!”并执行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
}
}
【问题讨论】:
-
您正在寻找的是一种生产者-消费者机制,其中存储的数据将是您要由线程执行的操作。 msdn.microsoft.com/en-us/library/hh228601%28v=vs.110%29.aspx
标签: c# multithreading