C# 跨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"; } } 当

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

例如,以下类型
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); });