Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# L2SQL是否异步?_C#_Linq To Sql_Asynchronous - Fatal编程技术网

C# L2SQL是否异步?

C# L2SQL是否异步?,c#,linq-to-sql,asynchronous,C#,Linq To Sql,Asynchronous,我真的很难决定如何构建我的sql层。我正在构建一个Web服务,它将与sql和非sql服务器进行通信。所以我提出了一系列的想法,这样我们就可以进行测试,等等 现在我有一堆文件和一个结构,我解释说(对不起,我使用了我没有使用的用户名称…请在这种情况下更正我): -IDatabaseStore.cs -SqlDatabaseStore.cs -NoSQLDatabaseStore.cs -以及我的所有特定存储(例如,实现sql存储的userStore.cs) 我想做以下几件事: SQL和NoSQLDa

我真的很难决定如何构建我的sql层。我正在构建一个Web服务,它将与sql和非sql服务器进行通信。所以我提出了一系列的想法,这样我们就可以进行测试,等等

现在我有一堆文件和一个结构,我解释说(对不起,我使用了我没有使用的用户名称…请在这种情况下更正我): -IDatabaseStore.cs -SqlDatabaseStore.cs -NoSQLDatabaseStore.cs -以及我的所有特定存储(例如,实现sql存储的userStore.cs)

我想做以下几件事: SQL和NoSQLDatabaseStore都将实现IDatabaseStore。这两个类将是抽象的,以提供与存储库模式类似的基本功能。所有特定的存储都将实现两个抽象类中的一个,以避免重建所有内容

现在的问题是:我使用的无SQL库是MyTouch,并且完全异步,但是对于SQL,我使用的L2SQL不是异步的

现在我的问题是:在你看来,这是如何设置的

  • 与示例1类似,强制这两种方法都使用异步方法,如果它们不是异步的(如L2SQL)

  • 使接口如示例2所示,如果需要异步,则所有动态接口都将泛型类型作为任务传递。这样,我就不必强制我的接口或抽象类是异步的(但void方法从来都不是异步的?)

  • 我是否错过了使L2SQL异步的方法?注意:我已经看到了很多帖子,但它们似乎不适合这个模型

  • 还有其他建议吗

  • 在性能方面,我真的很希望有一个异步L2SQL,因为我需要管理很多连接,这对Web服务非常有益。但例如,一个解决方案,比如:难道不是等待着,不是吗

    例1:

    public interface IDatabaseStore {
       Task<T> GetByID(string id);
       Task<List<T>> GetAll();
       Task Delete(T model);
       Task Update(T model);
       Task Insert(T model);
    }
    
    公共接口IDatabaseStore{
    任务GetByID(字符串id);
    任务GetAll();
    任务删除(T模型);
    任务更新(T模型);
    任务插入(T模型);
    }
    
    例2:

    public interface IDatabaseStore {
        T GetByID(string id);
        List<T> GetAll();
        void Delete(T model);
        void Update(T model);
        void Insert(T model);
    }
    
    公共接口IDatabaseStore{
    T GetByID(字符串id);
    List GetAll();
    无效删除(T型);
    空洞更新(T模型);
    空洞插入(T型);
    }
    
    本文对此进行了深入讨论:

    总之,不,你不应该。最好的解决方案是简单地将同步和异步分开。每个实现都有单独的接口,每个实现只实现与它们实际上是同步的还是异步的对应的接口。不要试图将两者统一为一个接口


    您有两种截然不同的DB操作类型。它们是如此的不同,所以应该以不同的方式消费。它们的可互换性是不正确的,因此您不应该试图强制实现这种可互换性。

    最新版本的Entity Framework支持异步操作,因此,我建议您在EF6和MyTouch实现中使用异步接口。

    您是否考虑过用Entity Framework替代L2SQL?@StephenCleary是的,我一直在研究它,但我从大约10篇so文章中了解到,L2SQL比EF更快。或者在这种情况下,由于采用异步方法,EF的优势更大?@StephenCleary在这种情况下,它将是一个完美的解决方案。是的,EF的最新版本支持
    async
    ,这将是我选择的选项。L2SQL尚未更新,也可能不会更新(它最初是EF的早期版本,自从EF获得了与它相同的功能后,它已经过时了一段时间)。感谢anwser@StephenCleary,我不知道L2SQL已经过时了,而且在这一点上,我肯定为项目的未来做出了错误的选择。我会看一看,找到更多关于它的信息。请把它作为一个awnser,我会接受。谢谢你的文章,我会看看它。我同意这是两种截然不同的数据库类型。但我不同意它们不能互换。如果我要求NoSQL获取用户X,我需要一个getByID方法。但当我要求它使用SQL时,我希望使用完全相同的方法。只是执行方式不同而已。在这种情况下,我认为这个界面在服务器上做得很好。除此之外,通过使用L2SQL和MyTouch,他们还可以为这样一个简单的方法实现默认实现,这可以防止多次编写代码。@如果您已经知道问题的答案,并且不愿意接受其他可能的答案,那么,为什么首先要问这个问题呢?我确实愿意寻找其他可能的解决办法。查看主帖子上的评论。不过,我只是不同意你所说的。如果我说的不是真的,请解释。我愿意接受你的答案,如果它是正确的,我只是说我不同意,原因是什么。我不是想冒犯你…@spons如果你所有的DB操作都不是异步的,你不应该假装它们是异步的。通常,这将成为任何应用程序异步的“基础”。如果它实际上不是异步的,那么您可能应该让整个应用程序不是异步的。如果需要,那么它应该知道底层UI不是异步的,它正在将同步UI工作卸载到另一个线程,并显式地这样做。否则,它会给人一种错误的印象,即你的应用程序实际上是异步的,而不是异步的。我同意你的观点,我不想假装它们是异步的,这就是我在这里首先提出这个问题的原因。但是你是说我的示例一开始并不好,但是如果我使用@StephanCleary建议的Enity框架,它可以异步工作。在这种情况下,我的所有数据库操作都是异步的否?然后我会用好的方法不?会给人留下好印象吗?(还是我误解了什么?)