繁体   English   中英

Java与C#中的线程

[英]Threading in Java vs. C#

对于我困惑的事情,我需要一点确认。 我知道线程在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
 }

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

我有一些观察:

首先,尽管您在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中的匿名类更强大,因为您可以修改捕获的变量。 这可能很方便,但也是脚下射击的好方法。

有几种不同的方法可以在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) );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM