2009-12-17 18 views

Trả lời

27

Không. C# xử lý các luồng khác nhau với Java. Thay vì phân lớp lớp Thread, bạn chỉ cần tạo một đối tượng System.Threading.Thread mới và chuyển cho nó một delegate ThreadStart (đây là hàm mà bạn thực hiện công việc) ..

+5

Lưu ý phụ: trong Java, giao diện 'Runnable' là một thay thế cho phân lớp' Thread', nhưng bạn vẫn phải tạo một đối tượng 'Thread' mới, chuyển' Runnable' thành một hàm tạo. – Powerlord

+4

Về cơ bản, ThreadStart * là * chính xác C# tương đương với Runnable của Java. –

+0

@Michel Borgwardt: Yeap, câu trả lời là đúng (về bản chất) nhưng sai trong cách nó được viết. – OscarRyz

4

Không cần thiết - chủ đề trong C# trường hợp của một đại diện ThreadStart hoặc ParameterizedThreadStart là các thành phần có thể chạy của chuỗi để thực thi.

3

. Net sử dụng ThreadStartParameterizedThreadStart đại biểu cho chủ đề khởi động.

Đại biểu là công dân hạng nhất trong .Net, bạn có thể tham khảo xung quanh nếu cần.

4

Gần nhất với API luồng hướng nhiệm vụ cấp cao sẽ là BackgroundWorker. Như những người khác đã đề cập, .NET (và do đó C#) sử dụng các đại biểu đại diện cho một phương thức có thể gọi. Java không có khái niệm đó (các con trỏ hàm), và thay vào đó sử dụng các giao diện cho các đối tượng có thể gọi được.

11

ThreadStart delegate về cơ bản giống với giao diện Runnable. Một đại biểu giống như một giao diện cho một phương thức duy nhất chứ không phải toàn bộ một lớp, do đó, nó thực sự dễ thực hiện hơn giao diện Runnable trong Java.

MSDN explains about delegates:

Các đại biểu và giao diện tương tự như ở chỗ chúng cho phép việc tách đặc điểm kỹ thuật và thực hiện. Nhiều tác giả độc lập có thể triển khai các triển khai tương thích với giao diện đặc điểm kỹ thuật. Tương tự, một đại biểu chỉ định chữ ký của phương thức, và tác giả có thể viết các phương pháp tương thích với đặc quyền của đại biểu . Khi nào bạn nên sử dụng giao diện và khi nào bạn nên sử dụng đại biểu?

Các đại biểu có ích khi:

  • Một phương pháp đơn đang được gọi.
  • Một lớp học có thể muốn có nhiều triển khai của phương pháp đặc điểm kỹ thuật.
  • Bạn nên sử dụng phương pháp tĩnh để triển khai đặc điểm .
  • Mẫu thiết kế giống như sự kiện là mong muốn (để biết thêm thông tin, hãy xem Hướng dẫn về sự kiện ).
  • Người gọi không cần biết hoặc lấy đối tượng mà phương pháp được xác định.
  • Nhà cung cấp thực hiện muốn "trao tay" việc thực hiện đặc điểm kỹ thuật cho chỉ một vài thành phần được chọn.
  • Bố cục dễ dàng là mong muốn.

Giao diện này rất hữu ích khi:

  • Đặc tả định nghĩa một tập hợp các phương pháp có liên quan sẽ được gọi.
  • Một lớp thường thực hiện đặc tả chỉ một lần.
  • Người gọi của giao diện muốn truyền đến hoặc từ giao diện để lấy các giao diện khác hoặc lớp học.
6

C# sử dụng các đại biểu ThreadStart thay vì Runnable phong cách của Java.

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(); 
    } 
} 
48

Liệu C# có một tương đương với giao diện Runnable Java?

Có, đó là ThreadStart

class Runner 
{ 
    void SomeMethod() 
    { 
     Thread newThread = new Thread(new ThreadStart(Run)); 
     newThread.Start(); 
    } 

    public void Run() 
    { 
      Console.WriteLine("Running in a different thread.") 
    } 
} 

sẽ được tương đương với mã Java sau

class Runner implements Runnable { 

    void someMethod() { 
     Thread newThread = new Thread(this); 
     newThread.start(); 
     } 

     public void run() { 
      out.println("Running in a different thread."); 
     } 
    } 
+0

Tính đến 2015-09-25, điều này vẫn chưa được thực hiện cho Xamarin, vì vậy bạn đang mắc kẹt với các tùy chọn Frankenstein C#/Java để thực hiện điều tương tự như câu trả lời này. – codeMonkey

Các vấn đề liên quan