[英]Problem with installing chocolatey files with task.run on windows 8.1
我的任務是創建一個工具,以幫助輕松地建立客戶系統。 我創建了一個函數,該函數在C#中通過powershell調用巧克力腳本,並使用Task.run創建一個新線程,因此它不會影響UI線程,系統工作正常,但某些計算機出現問題。 我無權訪問這些計算機並且對他們的系統了解不多,並且由於時間限制而無法訪問這些計算機也無濟於事。 我知道他們有Windows 8.1。 我得到了Windows 10虛擬機進行測試(我仍然不明白,因為這是Windows 8問題)
這是代碼。 我知道一個事實(由於一次訪問這些計算機),它停止在Task.Run(()=> task)上
有誰知道Windows 8.1上的Chocolatey或Tasks是否有問題?
Task callTask = Task.Run(() => ExecuteAsynchronouslyAsync("chocolatey string", CheckBox box, string logName));
public async Task<PowerShellAction> ExecuteAsynchronouslyAsync(String commandStr, CheckBox box, string logName)
{
powerShellAction = new PowerShellAction();
powerShellAction.isFinished = false;
using (PowerShell ps = PowerShell.Create())
{
ps.AddScript(commandStr); // adding the script to the powershell script.
outputCollection = new PSDataCollection<PSObject>();
outputCollection.DataAdded += OutputData;
IAsyncResult result = ps.BeginInvoke<PSObject, PSObject>(null, outputCollection);
PSDataCollection<PSObject> execRes = await Task.Factory.FromAsync(result, ps.EndInvoke);
}
return powerShellAction;
}
現在正在嘗試獲取8.1的虛擬機,以繼續嘗試調試自己。 任何其他建議都將受到歡迎。
不幸的是,我不能保證我的建議是正確的。 主要原因是,我無法弄清楚PowerShellAction
應該是什么。 我在這里假設PowerShell
是System.Management.Automation.PowerShell
。
我建議幾件事:
var
或類型聲明,並且由於additional string
關鍵字而導致方法調用無效。 請嘗試避免將來再粘貼類似您的代碼,因為重建示例非常困難。 box.IsChecked
作為bool
)。 ConfigureAwait(false)
添加到您的await
以防止.NET嘗試同步回上下文。 代碼(unestet)可能是這樣的:
var task = Task.Run(() => ExecutePowerShellAsync("chocolatey string", box.IsChecked, "NameOfTheLog"));
public async Task<PowerShellAction> ExecutePowerShellAsync(String commandStr, bool checkBoxValue, string logName)
{
var powerShellAction = new PowerShellAction();
powerShellAction.isFinished = false;
using (PowerShell ps = PowerShell.Create())
{
ps.AddScript(commandStr); // adding the script to the powershell script.
var outputCollection = new PSDataCollection<PSObject>();
outputCollection.DataAdded += OutputData;
IAsyncResult result = ps.BeginInvoke<PSObject, PSObject>(null, outputCollection);
PSDataCollection<PSObject> execRes = await Task.Factory.FromAsync(result, ps.EndInvoke).ContinueWith(t => {
if (t.IsFaulted)
{
System.Diagnostics.Trace.TraceError("Task faulted with exception: " + t.Exception?.Message);
}
return t.Result;
}).ConfigureAwait(false);
}
return powerShellAction;
}
我使用ContinueWith
以便能夠對原始任務中可能發生的任何異常做出反應。
我建議這樣做是因為您的描述聞起來像是您具有典型的線程鎖,這意味着由於異常或上下文同步問題而導致簡單的代碼無法返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.