C#非UI跨线程调用

Rus*_*hyo 2 c# multithreading invoke

我正在尝试用C#进行跨线程调用.

每当我从一个从线程B调用的静态方法调用在线程A的上下文中创建的对象的方法时,该方法总是在线程B中运行.我不希望这样,我希望它在与线程相同的线程上运行我正在调用其方法的对象.

Invoke适用于UI调用,我读过很多文章和SO答案,涉及不同的交叉线程Forms/WPF调用方式.无论我尝试什么(事件处理,委托等)线程A的对象的方法将始终在线程B中运行,如果它由线程B调用.

我应该在图书馆的哪个部分来解决这个问题?如果相关,则线程B当前"旋转",从网络端口读取并偶尔通过在线程A中创建并使用ParameterizedThreadStart传入的委托调用线程A的对象方法.

我不打算改变范例,只是从一个线程(线程B)向另一个线程(线程A)发送消息(调用方法的请求).

编辑:

我的问题是"我应该在图书馆的哪个部分来解决这个问题?" 答案似乎是没有.如果我想清楚地描述消费和民意调查,我将不得不编写自己的代码来处理这个问题.

cdh*_*wie 6

每当我调用在线程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)