2013-06-13 45 views
11

Trong C# (.NET), có thể hai luồng chạy trong cùng một ứng dụng có KHÁC "WorkingFolders" ??Có thể sử dụng Ứng dụng đa luồng C# seprate WorkingDirectories cho mỗi luồng không?

Tốt nhất tôi có thể biết, câu trả lời sẽ là "KHÔNG". Tôi nghĩ DIR LÀM VIỆC được thiết lập bởi QUY TRÌNH trong Win32 .. Tôi có sai ở đây không?

Theo mã kiểm tra sau, (cũng như lệnh gọi Win32 SetCurrentDirectory API), điều này là KHÔNG, nhưng có ai tìm ra cách để làm cho nó có thể không?

using System; 
using System.Threading; 

public class TestClass { 

    public ManualResetEvent _ThreadDone = new ManualResetEvent(false); 

    public static void Main() { 
    Console.WriteLine(Environment.CurrentDirectory); 

    Thread _Thread = new Thread(new ParameterizedThreadStart(Go)); 
    TestClass test = new TestClass(); 

    _Thread.Start(test); 
    if(test._ThreadDone.WaitOne()) { 
     Console.WriteLine("Thread done. Checking Working Dir..."); 
     Console.WriteLine(Environment.CurrentDirectory); 
    } 
    } 

    public static void Go(object instance) { 
    TestClass m_Test = instance as TestClass; 
    Console.WriteLine(Environment.CurrentDirectory); 
    System.IO.Directory.SetCurrentDirectory("L:\\Projects\\"); 
    Console.WriteLine(Environment.CurrentDirectory); 
    m_Test._ThreadDone.Set(); 
    } 
} 

Tôi biết MỘT SỐ người ngoài kia phải chạy qua trước đây!

+5

Mục tiêu của bạn trong việc cố gắng điều này là gì? Tốt hơn là chỉ thiết kế mã của bạn để cho phép bạn chuyển vào các thư mục thích hợp ... –

+0

Có thể bằng cách tạo miền ứng dụng riêng cho mỗi chuỗi. Tôi đã thêm nhận xét này làm nhận xét vì hiện tại tôi không thể hiển thị ví dụ. – MarcF

+1

@MarcF App Domains sẽ không thay đổi một bộ Môi trường cho mỗi Quy trình (FYI). –

Trả lời

9

Tôi sẽ đoán bạn đang làm gì cố gắng để thực hiện là tạo mã như File.Open("Foo.txt") hoạt động khác nhau trên các chuỗi khác nhau. Bạn làm được cái này không? Câu trả lời ngắn gọn là Không - bạn cũng không nên là đang cố gắng để thực hiện việc này. Trên Windows, thư mục làm việc hiện tại được đặt ở cấp quy trình. Khuôn khổ .NET không vi phạm quy tắc đó.

Một cách tiếp cận tốt hơn là tạo một trừu tượng ở trên cùng của Environment.CurrentDirectory, đó là một chủ đề cụ thể. Một cái gì đó như:

public static class ThreadEnvironment 
{ 
    [ThreadStatic] 
    static string _currentDir; 

    public static string CurrentDirectory 
    { 
     get 
     { 
     if (_currentDir == null) // If Current Directory has not been set on this thread yet, set it to the process default 
     { 
      _currentDir = Environment.CurrentDirectory; 
     } 

     return _currentDir; 
     } 

     set 
     { 
     if (value == null) 
      throw new ArgumentException("Cannot set Current Directory to null."); 

     _currentDir = value; 
     } 
    } 
} 

Sau đó bạn có thể tham khảo để có được ThreadEnvironment.CurrentDirectory thư mục hiện hành của chủ đề đó, mà sẽ mặc định vào thư mục quá trình nếu nó chưa được cài đặt trên chủ đề đó. Ví dụ:

static void Main(string[] args) 
{ 
    (new Thread(Thread1)).Start(); 
    (new Thread(Thread2)).Start(); 
} 

static void Thread1() 
{ 
    Console.WriteLine("Thread1 Working Dir is: {0}", ThreadEnvironment.CurrentDirectory); 
    ThreadEnvironment.CurrentDirectory = @"C:\"; 
    Console.WriteLine("Thread1 Working Dir is: {0}", ThreadEnvironment.CurrentDirectory); 
} 

static void Thread2() 
{ 
    Console.WriteLine("Thread2 Working Dir is: {0}", ThreadEnvironment.CurrentDirectory); 
    ThreadEnvironment.CurrentDirectory = @"C:\Windows"; 
    Console.WriteLine("Thread2 Working Dir is: {0}", ThreadEnvironment.CurrentDirectory); 
} 

Tất nhiên, bạn cần phải đủ điều kiện đường dẫn đó bất cứ khi nào giao dịch với tệp IO, tuy nhiên điều này được cho là thiết kế an toàn hơn.

+0

Điều gì tạo ra 'AppDomain' khác nhau và đặt 'AppDomainSetup.PrivateBinPath' ở đó? Bằng cách đó, bằng cách nào đó anh ấy có thể "thiết lập" nó. Có lẽ tôi đã nhầm – Odys

+1

Tôi nghĩ mục tiêu ở đây là làm cho 'File.Open (" Foo.txt ")' hoạt động khác nhau trên các chủ đề khác nhau. Và câu trả lời là không, bạn không thể làm điều đó và bạn cũng không nên cố gắng làm điều đó. –

3

có ai tìm ra cách để làm cho nó có thể không?

Chỉ đơn giản là không thể. Bạn thậm chí không thể có các thư mục làm việc khác nhau cho mỗi Miền ứng dụng.

Quy tắc cửa sổ là: một bộ Môi trường cho mỗi Quy trình. Chạy trong .NET sẽ không thay đổi các quy tắc cơ bản.

Thay vì đó, nếu bạn gặp sự cố khi tải hội đồng, hãy cân nhắc thêm thư mục tương ứng vào biến môi trường PATH.

+0

Cảm ơn Erik, đây là điều tôi nghi ngờ, nhưng tôi nghĩ cho đến nay, tôi nghĩ Mike Christensen có câu trả lời hay nhất ... Điều này cho phép tôi mã hóa đường dẫn CurrentDir + Passed/File thành các hàm IO của tôi và cho phép hoạt động tôi đang tìm kiếm. Nhưng, vì tài liệu Win32, tôi sợ rằng đây là trường hợp ... – LarryF

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