【发布时间】:2021-12-30 16:04:16
【问题描述】:
我正在尝试使用 Blazor WASM 开发一个可扩展的应用程序,该应用程序从服务器下载插件,并将它们缓存在浏览器存储中。 下载和缓存 API 都是异步的。
下面的AssemblyLoadContext,负责加载插件程序集。 由于插件可能包含多个程序集文件,并且项目应该支持延迟加载引用的程序集,我正在处理 Resolving 事件如下:
public class PluginAssemblyLoadContext : AssemblyLoadContext
{
private readonly IPluginResolver? _pluginResolver;
public PluginAssemblyLoadContext(string name) : this(name, null)
{
}
public PluginAssemblyLoadContext(string name, IPluginResolver? pluginResolver) : base(name, isCollectible: true)
{
_pluginResolver = pluginResolver;
if (pluginResolver != null)
{
Resolving += ResolveAssembly;
}
}
protected override Assembly? Load(AssemblyName name)
{
return null;
}
private Assembly? ResolveAssembly(AssemblyLoadContext context, AssemblyName assemblyName)
{
try
{
var assembly = AssemblyLoadContext.Default.Assemblies.FirstOrDefault(x => x.GetName().Name == assemblyName.Name);
if (assembly == null)
{
var task = _pluginResolver?.ResolveAsync(context, assemblyName);
if (task != null)
{
task.Wait(); // <- The problem!
assembly = task.Result; // <- The problem!
}
}
if (assembly == null)
{
// TODO: Log...
}
return assembly;
}
catch (Exception ex)
{
// TODO: Log...
throw;
}
}
}
问题是我无法从此方法调用异步 API,因为它会引发异常,提示“无法在此运行时等待监视器”。我不知道我应该如何同步调用它们。
感谢您的帮助
【问题讨论】:
标签: c# async-await blazor-webassembly