Проблема с установкой шоколадных файлов с помощью task.run на windows 8.1 - PullRequest
0 голосов
/ 08 января 2019

Мне поручено создать инструмент, который поможет легко настраивать системы клиентов. Я создал функцию, которая вызывает шоколадный сценарий через powershell в c #, и я использую Task.run для создания нового потока, чтобы он не влиял на поток пользовательского интерфейса. Система работает нормально, но у меня проблемы с некоторыми компьютерами , Не помогло то, что у меня нет доступа к этим компьютерам и я не очень разбираюсь в их системе, и из-за нехватки времени не имею доступа к этим компьютерам. Я знаю, что у них есть Windows 8.1. Мне дали тестировать виртуальную машину Windows 10 (которую я до сих пор не понимаю, так как было известно, что это проблема Windows 8)

Вот код. Я точно знаю (из-за того, что однажды мне был предоставлен доступ к этим компьютерам), что он останавливается на Task.Run (() => task)

Кто-нибудь знает, есть ли проблемы с шоколадкой или Tasks на Windows 8.1?

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 продолжать попытки отладки самостоятельно. Любые другие предложения будут приветствоваться.

1 Ответ

0 голосов
/ 08 января 2019

К сожалению, я не могу гарантировать, что мои предложения верны. Основная причина в том, что я не могу понять, что такое PowerShellAction. Я предполагаю, что PowerShell это System.Management.Automation.PowerShell.

Я предлагаю несколько вещей:

  1. Ваш код не компилируется по нескольким причинам: у вас нет var или объявления типа в первой строке вашего метода, и вызов метода не будет работать из-за добавления ключевого слова string. Постарайтесь избегать вставки кода, подобного вашему, в будущем, потому что довольно сложно перестроить ваш пример.
  2. Не обходите элемент управления пользовательского интерфейса асинхронным методом, а вместо этого используйте необходимое значение (например, box.IsChecked в качестве bool).
  3. Добавьте ConfigureAwait(false) в await, чтобы предотвратить попытку .NET выполнить синхронизацию с контекстом.
  4. Больше внимания уделяйте обработке исключений в вашем методе.
  5. Не возвращайте ничего, если вам это не нужно в вашем методе.

Код (untestet) может выглядеть примерно так:

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, чтобы иметь возможность реагировать на любые исключения, которые могут возникнуть в исходной задаче.

Я предлагаю это, потому что ваше описание пахнет, как будто у вас типичная блокировка потока, что означает, что простой код не возвращается из-за исключительной ситуации или проблем с синхронизацией контекста.

...