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类.
但要注意:多线程应用程序非常难以正确,我不会向程序添加多线程功能,除非:
进程的所有线程共享相同的数据(忽略线程本地存储),因此不需要在线程之间显式迁移对象.
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)
如果您在线程中运行的方法驻留在自定义类中,您可以让此类的成员来保存参数。
public class Foo
{
object parameter1;
object parameter2;
public void ThreadMethod()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)