2013-03-13 27 views
5

Đây là những gì tôi muốn đạt được theo cách này hay cách khác.Chuyển đối tượng "gốc" sang công việc nền

Tôi có một hội đồng tùy chỉnh xác định một số đối tượng. Trong kịch bản của tôi, tôi tạo một đối tượng tùy chỉnh mà tôi muốn chuyển sang một khối tập lệnh, giữ cho hành vi đối tượng đó.

Add-Type -AssemblyName MyCustomDLL 

$global:object = new-object MyCustomDLL.MyCustomObject() 
$object | gm 

$jobWork = { param ($object) $object | gm } # I'd like to keep my object behavior in that block 

$job = Start-Job -ScriptBlock $jobWork -ArgumentList $object 
Wait-Job $job 
Receive-Job $job 

Làm cách nào tôi có thể làm điều đó hoặc đạt được hiệu quả tương tự? Cảm ơn sự giúp đỡ của bạn

Trả lời

7

Thay vì việc làm nền bạn có thể sử dụng PowerShell với BeginInvoke, EndInvoke. Dưới đây là ví dụ đơn giản nhưng hoạt động của việc truyền một đối tượng trực tiếp trong "công việc", thay đổi nó ở đó, nhận kết quả:

# live object to be passed in a job and changed there 
$liveObject = @{ data = 42} 

# job script 
$script = { 
    param($p1) 
    $p1.data # some output (42) 
    $p1.data = 3.14 # change the live object data 
} 

# create and start the job 
$p = [PowerShell]::Create() 
$null = $p.AddScript($script).AddArgument($liveObject) 
$job = $p.BeginInvoke() 

# wait for it to complete 
$done = $job.AsyncWaitHandle.WaitOne() 

# get the output, this line prints 42 
$p.EndInvoke($job) 

# show the changed live object (data = 3.14) 
$liveObject 
3

Công việc nền được xây dựng trên đỉnh PowerShell remoting và như vậy, thực hiện các hành động tương tự khi truyền các vật thể xung quanh. Họ sẽ tuần tự hóa/deserialize họ hơn là vượt qua chúng với tất cả sự phức tạp của họ.

Tôi đoán là cách duy nhất để có được đối tượng phức tạp là chỉ để chuyển đối số và/hoặc hoạt động của hàm tạo là -ArgumentList và tạo đối tượng trong công việc.

Trong trường hợp này cũng bổ sung lắp ráp sẽ phải là một phần của công việc:

Start-Job { 
    param ($ConstructorArguments) 
    Add-Type -AssemblyName MyCustomDll 
    $object = New-Object MyCustomDll.MyCustomObject $ConstructorArguments 
    $object | Get-Member 
} -ArgumentList Foo, Bar | Wait-Job | Receive-Job 
+0

Nếu đối tượng là statefull và bạn đã thay đổi trạng thái trong tập lệnh gọi, sẽ không giúp được gì. Có một ca khúc nào khác ngoài serialize/deserialize không? –

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