c#是否具有Java Runnable接口的等价物?
如果不能实现,或者根本不需要它?
感谢。
答案 0 :(得分:53)
c#是否具有Java Runnable接口的等效功能?
是的,它是ThreadStart
class Runner
{
void SomeMethod()
{
Thread newThread = new Thread(new ThreadStart(Run));
newThread.Start();
}
public void Run()
{
Console.WriteLine("Running in a different thread.")
}
}
等同于以下Java代码
class Runner implements Runnable {
void someMethod() {
Thread newThread = new Thread( this );
newThread.start();
}
public void run() {
out.println("Running in a different thread.");
}
}
答案 1 :(得分:28)
不。 C#以不同于Java的方式处理线程。您只需创建一个新的System.Threading.Thread对象并将其传递给ThreadStart委托(这是您执行工作的函数)而不是继承Thread类,而不是继承Thread类。
答案 2 :(得分:14)
ThreadStart
delegate与Runnable
接口基本相同。委托就像是单个方法而不是整个类的接口,因此它实际上比Java中的Runnable
接口更容易实现。
MSDN explains about delegates:
代理和接口类似 因为他们能够分离 规范和实施。 多位独立作者可以 产生实现 兼容接口 规格。同样,代表 指定方法的签名, 作者可以编写方法 与代表兼容 规格。你应该什么时候使用 接口,何时使用 代表?
代表在以下情况下非常有用:
- 正在调用一种方法。
- 类可能希望具有该方法的多个实现 说明书
- 希望允许使用静态方法来实现 说明书
- 需要类似事件的设计模式(有关更多信息,请参阅 活动教程)。
- 调用者无需知道或获取该方法的对象 定义于。
- 实施的提供者想要“分发” 规范的实施 只有少数选择组件。
- 需要简单的组合。
接口在以下情况下非常有用:
- 规范定义了一组相关的方法 调用。
- 类通常只实现一次规范。
- 接口的调用者想要转换为接口或从接口转换 键入以获取其他接口或 类。
答案 3 :(得分:6)
C#
使用ThreadStart
委托而不是Java的Runnable
样式。
public class Foo
{
public void DoStuff()
{
while (true)
{
// do some stuff
}
}
};
public class Bar
{
public static int Main()
{
Foo foo = new Foo();
// create a ThreadStart delegate and pass in the method that will run
// (similar to run on Java's Runnable)
Thread thread = new Thread(new ThreadStart(foo.DoStuff));
thread.Start();
}
}
答案 4 :(得分:4)
不需要 - C#中的线程采用ThreadStart
或ParameterizedThreadStart
委托的实例,它们是要执行的线程的可运行组件。
答案 5 :(得分:4)
最接近高级面向任务的线程API将是BackgroundWorker
。正如其他人所提到的,.NET(以及C#)使用委托来表示可调用方法。 Java没有那个概念(函数指针),而是使用可调用对象的接口。
答案 6 :(得分:3)
.Net使用ThreadStart
和ParameterizedThreadStart
委托来引导线程。
代表作为.Net的一等公民,如果需要,你可以随时提供参考。