【问题标题】:BeginInvoke not supported on .NET core? (PlatformNotSupported exception).NET 核心不支持 BeginInvoke? (PlatformNotSupported 异常)
【发布时间】:2017-07-19 07:09:34
【问题描述】:
我已将库 FluentFTP 移植到 .NET 标准/.NET 核心,但异步方法在 async/await 块中使用 BeginInvoke。所以它是这样的:
async ConnectAsync(){
BeginConnect();
}
void BeginConnect(){
BeginInvoke(...) << error at this point
}
那时我得到一个 PlatformNotSupported 异常。在 .NET 核心上可以做些什么来支持这一点?
【问题讨论】:
标签:
c#
asynchronous
cross-platform
.net-core
【解决方案2】:
正如@Steven_Cleary 所说,实现“真正的”异步方法的动机很明确,但有时您有遗留代码,您不能简单地进行异步。对于那些迫切需要保留旧界面的人:使用Task.Run。例如。当你有
IAsyncResult ar = someDelegate.BeginInvoke(state, null, null);
并使用ar 的属性来查看任务何时完成,你很幸运,因为Tasks 的等价物是:
Task task = Task.Run(() => someDelegate(state));
好消息是Task 类实现了IAsyncResult,这样您就可以回收现有代码。
稍后当您知道委托已完成时,您可能会调用
someDelegate.EndInvoke();
.NET Core 都不支持。这可以替换为
task.Wait();
它最终会抛出您的委托所抛出的异常,就像EndInvoke。
这在我们向 .NET Core 的迁移中奏效。