9

我有个问题。如果我有一个带有方法 DoSomething() 的对象,如果我为此方法创建多个线程,它是否可行且有效,它会作为自己的单独线程运行吗?

例如

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

4 回答 4

16

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

但是,如果您在该对象中使用状态(实例或静态字段等,以及与该状态相关的任何内容)可能会让您感到不安。您需要确保您对任何共享状态的访问都充分考虑(并且可能是同步)多线程访问。

于 2012-06-11T19:46:35.093 回答
3

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

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

于 2012-06-11T19:45:56.450 回答
1

如果我有一个带有方法 DoSomething() 的对象,如果我为此方法创建多个线程,它是否可行且有效,它会作为自己的单独线程运行吗?

是的,有可能。在您的代码示例中,DoSomethingSomeClass. 两个线程共享这一点。您有两个不同的线程,但共享一个实际对象。

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

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

于 2012-06-11T19:47:12.677 回答
1

它没有问题。我会运行没有任何错误。

这就像创建一个对象并在该对象上调用两次方法一样。唯一的事实是调用相同方法的两次发生在不同的线程上。

于 2012-06-11T19:49:53.237 回答