0

我需要对我感到困惑的事情进行一点确认。我知道线程在java中是如何工作的:

new DialList(string a , string b).start(); // where DialList is a class

public class DialList extends Thread {
    public DialList(String a, string b) {
        FilePath = a; 
        ThreadLogFile = b"; 
    }

    public void run() {
        // some code to run in different thread
    }
}

现在我想在 C# 中运行相同的代码。我应该将 run() 中的代码放入一个方法中并执行以下操作:

 Thread t = new Thread (runcsharp);          // Kick off a new thread
 t.Start(); 
 static void runcsharp(parameters) {
     // code
 }

还是有其他方法可以做到这一点?

4

2 回答 2

1

我有几点意见:

首先,尽管您在 java 中创建线程的方式可行,但推荐的方式是实现Runnable而不是扩展Thread. 这为您在可以使用相同代码的位置提供了更大的灵活性,因为您也可以将其提供ExecutorService给示例。

new Thread(new DialList(string a , string b)).start();

public class DialList implements Runnable {
    public DialList(String a, string b) {
        FilePath = a; 
        ThreadLogFile = b"; 
    }

    public void run() {
        // some code to run in different thread
    }
}

其次,是的,您可以在 C# 中使用该代码段,也可以使用 lambda 表达式:

Thread t = new Thread(
   o =>
   {
       // code
   });
t.Start(); 

C# 中的 Lambda 比 java 中的匿名类更强大,因为您可以修改捕获的变量。这可能很方便,但它也是一个很好的方式来射击自己的脚。

于 2012-09-05T22:38:28.973 回答
0

在 C# 中启动新线程有几种不同的方法。例如:

static void run()
{
    Thread t = new Thread(new ThreadStart(WriteY));
    t.Start();   // Run WriteY on the new thread.
}

void WriteY()
{
    // do something
}

请注意,这假设WriteY没有参数。如果是这样,您将不得不使用ParameterizedThreadStart委托。有关详细信息,请参阅 Joe Albahari 的优秀(免费)电子书

编辑:如果我理解正确,你有一个类型的对象DialList,你想传递给一个新线程。您可以通过以下方式在 C# 中执行此操作:

void WriteY(DialList dl)
{ // do something with the DialList
}

var dl = new DialList(AString, BString);
Thread T = new Thread( () => WriteY(dl) );
于 2012-09-05T21:34:26.670 回答