gpt4 book ai didi

c# - 接口(interface)和异步方法

转载 作者:IT王子 更新时间:2023-10-29 03:50:40 26 4
gpt4 key购买 nike

我有一个应用程序。此应用程序使用一个接口(interface)来访问数据库。这个接口(interface)可以被很多类实现。例如,一个使用 EF 4.4,但其他类可以使用效率更高的 EF5。将来我可能会使用 EF6,因为它使用异步方法。在此示例中,所有方法都使用 EF,但也许其他选项可以使用其他方式。

应用程序是一次编码,使用接口(interface),并根据配置文件,使用一个实现或另一个,所以我只需要修改一个地方的代码,即构造函数,以在实例化中添加新选项分配给接口(interface)的类。

目前类的所有方法都不是async,但将来如果我使用 EF6 我想使用异步方法,所以我不知道是否可以使用 EF6 并实现接口(interface)的类可以使用 async 方法。

对于 EF6 的异步方法,我会使用 async/awiat 模式,因此在我的类的方法中我需要使用 async 属性。这让我可以在调用 EF6 的异步方法时使用 await 关键字。

但是这个类能在第一时间实现同步方法的接口(interface)吗?

有什么方法可以在主应用程序中使用许多实现而无需修改代码?一些实现将使用异步方法,而其他实现将使用同步方法。

最佳答案

async不是签名的一部分,所以你实际上不需要关心实现接口(interface)的方法是否是 async与否,你只需要关心属性的类型、返回类型、方法名和可访问性。

真正的区别在于您的 async方法需要返回 TaskTask<T> ,而非异步方法目前很可能返回 void或者某种类型,T直接。

如果您想“面向 future ”您的应用程序,一种选择是确保您的所有接口(interface)都返回 TaskTask<T>并且对于您的 EF4/EF5 实现,您将结果包装在一个已完成的任务中,即使它们是同步执行的。

Task.FromResult是在 .NET 4.5 中添加的,但是如果您没有它,您可以很容易地编写自己的:

public static Task<T> FromResult<T>(T result)
{
var tcs = new TaskCompletionSource<T>();
tcs.SetResult(result);
return tcs.Task;
}

你也可以写一个CompletedTask简单地返回一个已经完成的任务的方法:(出于效率原因,它缓存了一个任务。)

private static Task _completedTask;
public static Task CompletedTask()
{
return _completedTask ?? initCompletedTask();
}

private static Task initCompletedTask()
{
var tcs = new TaskCompletionSource<object>();
tcs.SetResult(null);
_completedTask = tcs.Task;
return _completedTask;
}

这两种方法将简化让所有方法返回某种类型的 Task 的过程。 ,虽然这样做会使您的代码有点困惑,直到您能够使用 C# 5.0 能够 await结果。

关于c# - 接口(interface)和异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573516/

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