【问题标题】:Function in multithreading多线程中的函数
【发布时间】:2011-06-07 23:42:26
【问题描述】:

我有两个线程 t1 和 t2。我在 t1 中获取信息,基于它我想在 t2 中调用函数,该函数将在 t2 中工作。 我该怎么做?

编辑:

t2 是 c# 形式的线程。 t1 正在循环中工作,它获取 t2 应该调用函数的信息。我认为共享对象不起作用,因为 t2 在循环中不起作用,所以我无法检查某些对象是否已更改。

【问题讨论】:

  • 有趣。问题是?
  • 创建一个继承所述对象的新对象并在保持锁定模式的同时添加事件处理?

标签: c# multithreading


【解决方案1】:

在两个线程之间共享对象(例如,两个线程都运行的类的成员)并使用lock 模式访问它:

object _someobject; // as a member for example

...

lock (_someobject)
{
// manipulate the object
}

这样可以确保对象的一致性,避免两个线程同时与共享对象交互。

例如,如果其中一个线程是 GUI 线程,则另一种选择是使用 MethodInvoker

【讨论】:

  • 你可以使用一个共享/静态变量,两个线程都可以使用锁来接触。
  • 是的,对象也可以是静态的,但请注意,它是全局的。例如,如果您考虑系统或应用程序设置,仍然是一个选择。
  • 好的,MethodInvoker 帮忙了。谢谢。
【解决方案2】:

我相信正确的方法是使用InvokeBeginInvoke。你在 t1 上调用它,它在 t2 上执行。您需要引用在 t2 中运行的某些控件,例如表单本身。

您可以将数据包含在您在 t2 中调用的闭包中。

【讨论】:

    【解决方案3】:

    我设想使用 volatile 变量来存储 t1 找到的信息,而 t2 使用异常循环,直到找到所需的信息。但我可能是错的。

    【讨论】:

    • volatile 仅适用于字段,不适用于一般对象。
    • 点。提及对象对我来说很有用。 “愚人轻视智慧、教训和纠正”
    【解决方案4】:

    您将使用 Monitor.Wait 和 Pulse。它们将共享一个锁定对象和一个信号变量。等待线程将被阻塞,直到发出信号(由工作线程脉冲)。 例如:

        bool _go;
    lock (_locker)
                {
                    while (!_go) Monitor.Wait(_locker);
    
                }
                CallFunc();
    

    工作线程:

       // do work here
       DoWork();
       lock (_locker)
            {
                _go = true;
                Monitor.PulseAll(_locker);
            }
    

    【讨论】:

    • 函数应该执行的线程t2是GUI线程。你不能在那里做很长时间的Waits。
    • 你是对的,但他并没有说实际上是说UI线程。我认为它们是几个工作线程。无论如何,尝试编写代码来解决问题是毫无意义的,因为 OP 没有发布任何代码,所以问题不清楚。学过的知识。 :-|
    • 无论如何,我们是来帮忙的,而且在许多情况下,答案需要一些猜测。凭猜测,无法得出可靠的解决方案。
    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多