Rus*_*hyo 2 c# multithreading invoke
我正在尝试用C#进行跨线程调用.
每当我从一个从线程B调用的静态方法调用在线程A的上下文中创建的对象的方法时,该方法总是在线程B中运行.我不希望这样,我希望它在与线程相同的线程上运行我正在调用其方法的对象.
Invoke适用于UI调用,我读过很多文章和SO答案,涉及不同的交叉线程Forms/WPF调用方式.无论我尝试什么(事件处理,委托等)线程A的对象的方法将始终在线程B中运行,如果它由线程B调用.
我应该在图书馆的哪个部分来解决这个问题?如果相关,则线程B当前"旋转",从网络端口读取并偶尔通过在线程A中创建并使用ParameterizedThreadStart传入的委托调用线程A的对象方法.
我不打算改变范例,只是从一个线程(线程B)向另一个线程(线程A)发送消息(调用方法的请求).
编辑:
我的问题是"我应该在图书馆的哪个部分来解决这个问题?" 答案似乎是没有.如果我想清楚地描述消费和民意调查,我将不得不编写自己的代码来处理这个问题.
每当我调用在线程A上运行的对象的方法时
对象不在线程上运行.
为了使它能够工作,你将不得不创建某种类型的队列,你可以将一个委托推送到常规检查线程A的主循环中.这样的事情,假设Something.MainThreadLoop是线程A的入口点:
public class Something
{
private Queue<Action> actionQueue = new Queue<Action>();
private volatile bool threadRunning = true;
public void RunOnThread(Action action)
{
if (action == null)
throw new ArgumentNullException("action");
lock (actionQueue)
actionQueue.Enqueue(action);
}
public void Stop()
{
threadRunning = false;
}
private void RunPendingActions()
{
while (actionQueue.Count > 0) {
Action action;
lock (actionQueue)
action = actionQueue.Dequeue();
action();
}
}
public void MainThreadLoop()
{
while (threadRunning) {
// Do the stuff you were already doing on this thread.
// Then, periodically...
RunPendingActions();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,给定对Something对象的引用,您可以这样做:
something.RunOnThread(() => Console.WriteLine("I was printed from thread A!"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2748 次 |
| 最近记录: |