2013-02-16 29 views
6

Trong khi biên dịch chương trình của tôi (i biên dịch nó từ MonoDevelop IDE) tôi nhận được một lỗi:Cuộc gọi là mơ hồ giữa các phương pháp sau đây hoặc tài sản С #

Error CS0121: The call is ambiguous between the following methods or properties: System.Threading.Thread.Thread(System.Threading.ThreadStart)' and System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)' (CS0121)

Đây là một phần của mã.

Thread thread = new Thread(delegate { 
    try 
    { 
     Helper.CopyFolder(from, to); 
     Helper.RunProgram("chown", "-R www-data:www-data " + to); 
    } 
    catch (Exception exception) 
    { 
     Helper.DeactivateThread(Thread.CurrentThread.Name); 
    } 
    Helper.DeactivateThread(Thread.CurrentThread.Name); 
}); 
thread.IsBackground = true; 
thread.Priority = ThreadPriority.Lowest; 
thread.Name = name; 
thread.Start(); 

Cám ơn sự quan tâm của bạn

Trả lời

8

delegate { ... } là một phương pháp vô danh mà có thể được gán cho bất kỳ loại đại biểu, bao gồm ThreadStartParameterizedThreadStart. Vì Thread Class cung cấp quá tải constructor với cả hai kiểu đối số, nên nó không rõ ràng do quá tải của constructor.

delegate() { ... } (lưu ý dấu ngoặc đơn) là một phương thức ẩn danh không có đối số. Nó có thể được chỉ định chỉ để ủy quyền các loại không có đối số, chẳng hạn như Action hoặc ThreadStart.

Vì vậy, thay đổi mã của bạn để

Thread thread = new Thread(delegate() { 

nếu bạn muốn sử dụng các nhà xây dựng quá tải ThreadStart, hoặc để

Thread thread = new Thread(delegate(object state) { 

nếu bạn muốn sử dụng quá tải ParameterizedThreadStart constructor.

2

Lỗi này được ném khi bạn có một phương pháp mà có quá tải và sử dụng của bạn có thể làm việc với một trong hai tình trạng quá tải. Trình biên dịch không chắc chắn bạn muốn gọi quá tải nào, do đó bạn cần phải khai báo nó một cách rõ ràng bằng cách truyền tham số. Một cách để làm điều này là như thế này:

Thread thread = new Thread((ThreadStart)delegate { 
    try 
    { 
     Helper.CopyFolder(from, to); 
     Helper.RunProgram("chown", "-R www-data:www-data " + to); 
    } 
    catch (Exception exception) 
    { 
     Helper.DeactivateThread(Thread.CurrentThread.Name); 
    } 
    Helper.DeactivateThread(Thread.CurrentThread.Name); 
}); 
0

Ngoài ra, bạn có thể sử dụng một lambda:

Thread thread = new Thread(() => 
{ 
    try 
    { 
     Helper.CopyFolder(from, to); 
     Helper.RunProgram("chown", "-R www-data:www-data " + to); 
    } 
    catch (Exception exception) 
    { 
     Helper.DeactivateThread(Thread.CurrentThread.Name); 
    } 
    Helper.DeactivateThread(Thread.CurrentThread.Name); 
}); 

thread.IsBackground = true; 
thread.Priority = ThreadPriority.Lowest; 
thread.Name = name; 
thread.Start();   
Các vấn đề liên quan