如何在单独的进程中运行.netcore方法?

时间:2018-11-12 08:26:11

标签: c# asp.net-core .net-core

我的问题是我异步调用第三方方法,它有时可能会挂起,或者通常需要很长时间才能完成,但是无论出于何种原因,我们都需要杀死它。

  • 由于是第三方,因此无法使用任务和取消令牌 取消计算。
  • 据我了解,Thread.Abort()是邪恶的。尤其是因为这种方法将读写文件并建立与数据库的连接
  • 根据我所见,AppDomain是我可以使用的东西,但这在.netcore中不可用

似乎可以立即安全地杀死该方法的唯一方法是在一个进程中运行并杀死该进程。但是即使这样我也不确定是否可能。似乎只有.exe可以通过进程运行。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

.net核心中有AppDomain的解决方案,对此article进行了说明。

长话短说:

要替换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软件包的一部分。

AppDomain.CurrentDomain.GetAssemblies 创建 Pollyfill

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"));
    }
}

请注意,这些都是有关如何在.net核心中使用AppDomain的示例,有关如何使用.net核心中的AppDomain的功能。 < / p>