C# 跨AppDomain异步方法调用
在主AppDomain中,我尝试调用在不同AppDomain中实例化的类型中定义的异步方法 例如,以下类型C# 跨AppDomain异步方法调用,c#,appdomain,async-await,C#,Appdomain,Async Await,在主AppDomain中,我尝试调用在不同AppDomain中实例化的类型中定义的异步方法 例如,以下类型MyClass继承自MarshalByRefObject,并在新的AppDomain中实例化: public class MyClass : MarshalByRefObject { public async Task<string> FooAsync() { await Task.Delay(1000); return "Foo"; } } 当
MyClass
继承自MarshalByRefObject
,并在新的AppDomain中实例化:
public class MyClass : MarshalByRefObject
{
public async Task<string> FooAsync()
{
await Task.Delay(1000);
return "Foo";
}
}
当然,当我尝试进行调用时,我会得到一个序列化异常
,因为任务
类型不继承自MarshalByRefObject
,也不可序列化
我怎么会自大呢?我真的希望能够从另一个AppDomain中实例化的类型调用/等待异步方法。。。有办法吗
谢谢 我知道这个问题已经问了7年了,但如果有人觉得这很有帮助: 现在一个简单的解决方案可能是使用
Task.Run
调用同步方法,然后等待Task.Run
方法
而不是:
await RemoteObject.MethodAsync(); //Still throws a SerializationException.
使用:
您可以获取该方法的返回值(如果它不是void,并且其返回类型可以跨AppDomains):
Task.Run
将隐式变为Task.Run
当委托具有非无效返回类型时(委托本身将变为Func
而不是操作
)。如果使用括号创建lambda表达式,则必须手动返回该方法的结果,以暗示它是Func
而不是操作
:
var result = await Task.Run(()=>{ return RemoteObject.GetValue(parameter); });
你可能会觉得很有帮助。这正是我所期待的那种优雅的解决方案。谢谢斯蒂芬!!!在第二个appdomain中定义事件可能是一个解决方案。第一个appdomain在第二个appdomain中调用一个只触发事件的方法,控制返回到第一个appdomain,事件在第二个appdomain中继续执行。
await Task.Run(RemoteObject.Method); //If the method has no parameters.
await Task.Run(()=>RemoteObject.Method(parameter)); // If it does.
var result = await Task.Run(RemoteObject.GetDefaultValue); // If the method has no parameters.
var result = await Task.Run(()=>RemoteObject.GetValue(parameter)); // If it does.
var result = await Task.Run(()=>{ return RemoteObject.GetValue(parameter); });