你如何将对象放在另一个线程中?

Rus*_*sso 14 c# multithreading

在c#中有什么方法可以将对象放在另一个线程中吗?我发现的是如何在另一个线程中实际执行某些方法.我真正想要做的是在新线程中实例化一个对象,以便以后使用它提供的方法.

希望你能帮助我,Russo

GvS*_*GvS 25

对象实际上不属于某个线程.如果您有对象的引用,则可以从许多线程访问它.

这可能会给对象带来问题,这些对象不是设计为从许多线程访问的,例如(几乎所有)System.Windows.Forms类,以及对COM对象的访问.

如果您只想从同一个线程访问对象,请在对象(或包装对象)中存储对线程的引用,并通过该线程执行方法.


ang*_*son 16

关于线程如何在这里工作似乎有些混乱,所以这是一个入门(非常简短,所以在进一步尝试多线程编程之前你应该找到更多的材料.)

对象和内存本质上是多线程的,因为进程中的所有线程都可以根据用户的选择访问它们.

所以对象与线程没有任何关系.

但是,代码在一个线程中执行,它是代码执行的线程,你可能正在执行.

不幸的是,没有办法只是"将一个对象放入一个不同的线程",你需要专门启动一个线程并指定在该线程中执行的代码.因此,该代码使用的对象可以"说"属于该线程,尽管这是您自己强加的人为限制.

所以没有办法做到这一点:

SomeObject obj = new SomeObject();
obj.PutInThread(thatOtherThread);
obj.Method(); // this now executes in that other thread
Run Code Online (Sandbox Code Playgroud)

实际上,许多新的多线程程序员遇到的常见陷阱是,如果他们在一个线程中创建一个对象,并从另一个线程调用它的方法,那么所有这些方法都在创建该对象的线程中执行.这是不正确的,方法总是在调用它们的线程中执行.

所以以下内容也是错误的:

Thread 1:
    SomeObject obj = new SomeObject();

Thread 2:
    obj.Method(); // executes in Thread 1
Run Code Online (Sandbox Code Playgroud)

这里的方法将在线程2中执行.使方法在原始线程中执行的唯一方法是与原始线程合作并"请求它"执行该方法.你如何做到这一点取决于具体情况,有很多方法可以做到这一点.

总结一下你想要的东西:你想创建一个新线程,并在该线程中执行代码.

为此,请查看.NET 的Thread类.

但要注意:多线程应用程序非常难以正确,我不会向程序添加多线程功能,除非:

  1. 这是获得更多性能的唯一方法
  2. 而且,你知道你在做什么


Dan*_*ner 8

进程的所有线程共享相同的数据(忽略线程本地存储),因此不需要在线程之间显式迁移对象.

internal sealed class Foo
{
    private Object bar = null;

    private void CreateBarOnNewThread()
    {
        var thread = new Thread(this.CreateBar);

        thread.Start();

        // Do other stuff while the new thread
        // creates our bar.
        Console.WriteLine("Doing crazy stuff.");

        // Wait for the other thread to finish.
        thread.Join();

        // Use this.bar here...
    }

    private void CreateBar()
    {
        // Creating a bar takes a long time.
        Thread.Sleep(1000);            

        this.bar = new Object();
    }
}
Run Code Online (Sandbox Code Playgroud)


Ita*_*aro 0

如果您在线程中运行的方法驻留在自定义类中,您可以让此类的成员来保存参数。

public class Foo
{
   object parameter1;
   object parameter2;

   public void ThreadMethod()
   {
       ...
   }
}
Run Code Online (Sandbox Code Playgroud)