dar*_*key 5 c# appdomain async-await
从主AppDomain,我试图调用以不同AppDomain中实例化的类型定义的异步方法。
例如,以下类型MyClass继承MarshalByRefObject自新AppDomain并在其中实例化:
public class MyClass : MarshalByRefObject
{
public async Task<string> FooAsync()
{
await Task.Delay(1000);
return "Foo";
}
}
Run Code Online (Sandbox Code Playgroud)
在主AppDomain中,我创建一个新的AppDomain并在此AppDomain中创建MyClass的实例,然后调用异步方法。
var appDomain = AppDomain.CreateDomain("MyDomain");
var myClass = (MyClass)appDomain.CreateInstanceAndUnwrap(typeof(MyClass).Assembly.FullName, typeof(MyClass).FullName);
await myClass.FooAsync(); // BAM !
Run Code Online (Sandbox Code Playgroud)
当然,SerializationException当我尝试进行调用时会收到一个,因为该Task类型不继承自MarshalByRefObject,也不可序列化。
我怎样才能解决这个问题?我真的很希望能够从另一个AppDomain中实例化的类型上调用/等待异步方法...有没有办法?
谢谢 !
我知道这个问题已经有 7 年历史了,但如果有人觉得这有帮助的话:
如今,一个简单的解决方案可能是调用同步方法并Task.Run等待该Task.Run方法。
而不是:
await RemoteObject.MethodAsync(); //Still throws a SerializationException.
Run Code Online (Sandbox Code Playgroud)
使用:
await Task.Run(RemoteObject.Method); //If the method has no parameters.
await Task.Run(()=>RemoteObject.Method(parameter)); // If it does.
Run Code Online (Sandbox Code Playgroud)
你可以获取方法的返回值(如果它不是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.
Run Code Online (Sandbox Code Playgroud)
Task.RunTask.Run<returnType>当委托具有非 void 返回类型时将隐式变为(委托本身将变为 aFunc而不是 an Action)。如果您使用方括号创建 lambda 表达式,那么您必须手动返回该方法的结果,以暗示它是 aFunc而不是 an Action:
var result = await Task.Run(()=>{ return RemoteObject.GetValue(parameter); });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2255 次 |
| 最近记录: |