2011-09-09 30 views
5

Tôi có một vấn đề quyền hạn, và có thể ai đó có thể giúp tôi. Tôi đang sử dụng PowerShell 2.0 và tôi muốn tạo và sử dụng chuỗi. Tôi biết rằng tôi có thể sử dụng công việc, nhưng đó không phải là những gì tôi muốn. Tôi muốn một tập lệnh, tạo ra các biểu mẫu cửa sổ và chạy các chủ đề nền. Vì các mẫu đơn cần STA, điều này không dễ. Chạy "powershell.exe -sta" không phải là giải pháp.Powershell vấn đề xử lý thread

Dưới đây là tập lệnh mà tôi đã viết, để xử lý chuỗi đơn giản. Nhưng nó không hoạt động. Ngay cả các chủ đề mới sẽ không được tạo ra. Bất kỳ đề nghị, những gì là sai? Xin hãy giúp tôi nếu bạn có thể!

Trân trọng, Peter.

function ThreadProc() { 
    for ($i = 0; $i -lt 10; $i++) { 
     $ApartmentState = [System.Threading.Thread]::CurrentThread.GetApartmentState() 
     Write-Host "ThreadProc ($ApartmentState): $i" 
     # Yield the rest of the time slice. 
     [System.Threading.Thread]::Sleep(0) 
    } 
} 

$ApartmentState = [System.Threading.Thread]::CurrentThread.GetApartmentState() 
Write-Host "Main thread ($ApartmentState): Start a second thread." 

$thread_job = New-Object System.Threading.ThreadStart(ThreadProc) 
$thread = New-Object System.Threading.Thread($thread_job) 
$thread.CurrentThread.SetApartmentState([System.Threading.ApartmentState]::STA) 
$thread.Start() 

for ($i = 0; $i -lt 4; $i++) { 
    Write-Host("Main thread: Do some work.") 
    [System.Threading.Thread]::Sleep(0) 
} 

Write-Host("Main thread: Call Join(), to wait until ThreadProc ends.") 
$thread.Join() 
Write-Host("Main thread: ThreadProc.Join has returned. Program end.") 

Trả lời

1

Tôi nghĩ rằng câu hỏi của bạn là ở đâu đó gần một bài gọi là Powershell and Backgroundworker nhân .Background là để chạy mã NET trên một sợi nền.

Powershell, mặc dù đang làm việc trên đầu .NET không tạo ra ngôn ngữ trung gian (IL). Ngôn ngữ thông dịch của nó và mã của nó không thể chạy bên ngoài ngữ cảnh của một không gian chạy PowerShell. bạn có lẽ có thể sử dụng mã của bạn tạo PowerShell Runspace của riêng mình và chạy tập lệnh của bạn ở đó và kết hợp các kết quả trở lại phiên chính của bạn.

+0

Cảm ơn, tôi sẽ thử điều này nếu có thể. –

4

Nhận thấy một vài lỗi trong tập lệnh của bạn. Đầu tiên là $ thread_job, hãy thử thay vào đó:

[System.Threading.ThreadStart]$thread_job = {ThreadProc}; 

Bạn cần đặt dấu ngoặc quanh ThreadProc hoặc nó sẽ được đánh giá thay vì được chuyển thành hàm. Thứ hai, bạn có thể chỉ định kiểu cho các đại biểu như ThreadStart và PowerShell sẽ chuyển đổi mọi thứ cho bạn; không cần đối tượng mới.

Thứ hai CurrentThread là thành viên tĩnh - Tôi đoán $ Thread.currentThread là một lỗi đánh máy và bạn có nghĩa là:

$thread.SetApartmentState([System.Threading.ApartmentState]::STA); 

Tôi tưởng tượng bạn vẫn sẽ có những vấn đề nhận được nó để làm việc mặc dù - bất cứ khi nào tôi đã cố gắng sử dụng các chủ đề trong PowerShell trước khi tôi luôn gặp sự cố khó chịu mà không có giải thích thực tế nào ...

Bạn có thể viết một lệnh ghép ngắn trong C# và gọi thay vào đó không? Có thể dễ dàng hơn để làm những việc theo cách đó - bạn có thể thiết lập một Runspace mới và chạy lệnh của bạn trong luồng của Runspace khác.

EDIT

Tìm thấy những liên kết này có thể giúp bạn:

http://weblogs.asp.net/adweigert/archive/2008/04/29/powershell-threading-for-powershell-v1-0.aspx http://blogs.msdn.com/b/powershell/archive/2007/03/23/thread-apartmentstate -and-powershell-execution-thread.aspx

+0

+1 Cảm ơn bạn đã thêm liên kết, nó minh họa những gì tôi đang nói về việc tạo một không gian chạy. – JPBlanc

+1

Cảm ơn bạn đã sửa chữa! Mã đúng bây giờ, nhưng tôi cũng gặp phải sự cố. Trước đó tôi đã tìm thấy 2 liên kết trên nhưng không giúp ích gì cho tôi. Tôi sợ tôi phải tìm kiếm giải pháp khác. –

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