gpt4 book ai didi

c# - 跨 AppDomain 异步方法调用

转载 作者:行者123 更新时间:2023-12-03 15:02:14 26 4
gpt4 key购买 nike

从主 AppDomain,我试图调用在不同 AppDomain 中实例化的类型中定义的异步方法。

比如下面的类型MyClass继承自 MarshalByRefObject并在新的 AppDomain 中实例化:

public class MyClass : MarshalByRefObject
{
public async Task<string> FooAsync()
{
await Task.Delay(1000);
return "Foo";
}
}

在主 AppDomain 中,我创建了一个新的 AppDomain 并在此 AppDomain 中创建了 MyClass 的一个实例,然后我调用了 async 方法。
var appDomain = AppDomain.CreateDomain("MyDomain");
var myClass = (MyClass)appDomain.CreateInstanceAndUnwrap(typeof(MyClass).Assembly.FullName, typeof(MyClass).FullName);
await myClass.FooAsync(); // BAM !

当然,我得到一个 SerializationException当我尝试调用电话时,如 Task类型不继承自 MarshalByRefObject ,也不是可序列化的。

我怎么能解决这个问题?我真的很希望能够从另一个 AppDomain 中实例化的类型调用/等待异步方法......有没有办法?

谢谢 !

最佳答案

我知道这个问题已有 7 年历史,但如果有人觉得这有帮助:
如今,一个简单的解决方案可能是使用 Task.Run 调用同步方法。并等待Task.Run方法。
而不是:

await RemoteObject.MethodAsync(); //Still throws a SerializationException.
采用:
await Task.Run(RemoteObject.Method); //If the method has no parameters.
await Task.Run(()=>RemoteObject.Method(parameter)); // If it does.
您可以获取方法的返回值(如果它不是 void,并且它的返回类型可以跨 AppDomains):
var result = await Task.Run(RemoteObject.GetDefaultValue); // If the method has no parameters.
var result = await Task.Run(()=>RemoteObject.GetValue(parameter)); // If it does.
Task.Run将隐式变为 Task.Run<returnType>当委托(delegate)具有非 void 返回类型时(委托(delegate)本身将变为 Func 而不是 Action )。如果使用方括号创建 lambda 表达式,则必须手动返回该方法的结果以暗示它是 Func而不是 Action :
var result = await Task.Run(()=>{ return RemoteObject.GetValue(parameter); });

关于c# - 跨 AppDomain 异步方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com