Как запустить метод .netcore в отдельном процессе? - PullRequest
0 голосов
/ 12 ноября 2018

Моя проблема в том, что я вызываю сторонний метод асинхронно, и иногда он может зависнуть или занять много времени, но нам нужно убить его по любой причине.

  • Так как это третье лицо, задачи и токены отмены не могут быть использованы для отменить вычисление.
  • Из того, что я прочитал, тема. Аборт () - зло. Тем более что этот метод будет читать и записывать файлы и устанавливать соединения с нашей базой данных
  • Из того, что я видел, AppDomain - это то, что я мог бы использовать, но это не доступно в .netcore

Кажется, единственный способ выполнить этот метод так, чтобы я мог убить его немедленно и безопасно, это запустить его в процессе и уничтожить этот процесс. Но даже в этом я не уверен, что это возможно. Кажется, только .exe может быть запущен процессом.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 12 ноября 2018

Существует решение для AppDomain в ядре .net, это объясняется в этой статье .

Короче говоря:

Для замены AppDomain Событие выгрузки используйте :

System.Runtime.Loader.AssemblyLoadContext.Default.Unloading += context => InvokeBatchProcessors();

это часть библиотеки System.Runtime.Loader.

Appdomain GetAssemblies:

public static IEnumerable<Assembly> GetReferencingAssemblies(string assemblyName)
{
    var assemblies = new List<Assembly>();
    var dependencies = DependencyContext.Default.RuntimeLibraries;
    foreach (var library in dependencies)
    {
        if (IsCandidateLibrary(library, assemblyName))
        {
            var assembly = Assembly.Load(new AssemblyName(library.Name));
            assemblies.Add(assembly);
        }
    }
    return assemblies;
}

private static bool IsCandidateLibrary(RuntimeLibrary library, assemblyName)
{
    return library.Name == (assemblyName)
        || library.Dependencies.Any(d => d.Name.StartsWith(assemblyName));
}

Это часть пакета Microsoft.Extensions.DependencyModel.

Создание Pollyfill для AppDomain.CurrentDomain.GetAssemblies:

public class AppDomain
{
    public static AppDomain CurrentDomain { get; private set; }

    static AppDomain()
    {
        CurrentDomain = new AppDomain();
    }

    public Assembly[] GetAssemblies()
    {
        var assemblies = new List<Assembly>();
        var dependencies = DependencyContext.Default.RuntimeLibraries;
        foreach (var library in dependencies)
        {
            if (IsCandidateCompilationLibrary(library))
            {
                var assembly = Assembly.Load(new AssemblyName(library.Name));
                assemblies.Add(assembly);
            }
        }
        return assemblies.ToArray();
    }

    private static bool IsCandidateCompilationLibrary(RuntimeLibrary compilationLibrary)
    {
        return compilationLibrary.Name == ("Specify")
            || compilationLibrary.Dependencies.Any(d => d.Name.StartsWith("Specify"));
    }
}

Обратите внимание, что все это примеры того, как использовать AppDomain в ядре .net, для любых нужд использования функции AppDomain в ядре .net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...