簡體   English   中英

在Windows 8.1上使用task.run安裝Chocolatey文件的問題

[英]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應該是什么。 我在這里假設PowerShellSystem.Management.Automation.PowerShell

我建議幾件事:

  1. 您的代碼無法編譯有以下幾種原因:您在方法的第一行中沒有var或類型聲明,並且由於additional string關鍵字而導致方法調用無效。 請嘗試避免將來再粘貼類似您的代碼,因為重建示例非常困難。
  2. 不要將UI控件繞過異步方法,而要使用所需的值(例如box.IsChecked作為bool )。
  3. ConfigureAwait(false)添加到您的await以防止.NET嘗試同步回上下文。
  4. 更注意方法的異常處理。
  5. 如果您的方法不需要它,則不要返回任何內容。

代碼(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM