在对象的实例上为同一方法创建多个线程

时间:2012-06-11 19:41:36

标签: c# multithreading

我有一个问题。是否可能有效,如果我有一个方法DoSomething(),如果我为这个方法创建多个线程,它会工作吗,它会作为一个独立的线程运行吗?

E.g。

public class SomeClass
{
    public void DoSomething()
    {
        //somethings done here
    }
}

public class MainProgram
{
    public MainProgram()
    {
         InitializeComponents();
    }

    protected override OnStart(string[] args)
    {
         SomeClass sc = new SomeClass();
         Thread workerOne = new Thread(() => sc.DoSomething());
         workerOne.Start();

         Thread workerTwo = new Thread(() => sc.DoSomething());
         workerTwo.Start(); //start a new thread calling same method
    }
}

我希望能解释我的意思。这会起作用或导致任何问题吗?

我正在编写一个几乎需要实时软件的程序,我目前正在决定初始化SomeClass的新实例是否更好?

希望有人能回答。如果我的问题没有意义,请发表评论,我会进一步解释!

谢谢,

Base33

PS代码是专门为例子编写的:)

4 个答案:

答案 0 :(得分:13)

每个线程都有一个单独的调用堆栈,因此它们都可以在同一个对象上使用相同的方法。事实上,如果你需要,每个线程都可以(通过递归)在同一个实例上多次调用相同的方法

然而,如果您在该对象中使用状态(实例或静态字段等,以及与相关的任何内容),那么可能绊倒您的是 em>那个州)。您需要确保对任何共享状态的访问都能充分考虑(并且可能是同步)多线程访问。

答案 1 :(得分:3)

是的,你可以这样做。但是,您必须确保在该方法中的成员访问是线程安全的。

如果你改变了对象的状态,你应该锁定你的读写(不说任何特定的机制),或者验证在任何给定的时间内中断该方法是无害的,并且另一个线程上的另一个调用将是仍然可以正常工作

答案 2 :(得分:1)

  

是否可能有效,如果我有一个方法DoSomething(),如果我为这个方法创建多个线程,它会工作吗,它会作为一个单独的线程运行吗?

是的,这是可能的。在您的代码示例中,DoSomethingSomeClass的同一个实例上被调用。两个线程都分享这个。您有两个不同的线程,但共享一个实际对象。

  

这会起作用或导致任何问题吗?

这完全取决于您的使用案例。它可能会也可能不会。如果共享对象,则需要同步对它们的访问。

答案 3 :(得分:1)

没问题。我会毫无错误地运行。

  

就像在这个对象上创建一个对象和调用方法一样   两次。唯一的事实是两次调用相同的方法是打开的   不同的主题。