gpt4 book ai didi

c# - 执行多个数据库调用-单线程还是多线程?

转载 作者:行者123 更新时间:2023-12-03 10:36:35 25 4
gpt4 key购买 nike

我试图了解执行多个数据库调用时哪种方法最好。我有很多包含相同模式的屏幕:

  • 在屏幕加载
  • 时异步(异步/等待)获取数据
  • 将控件返回到UI线程,以便可以加载屏幕
  • 数据到达时,
  • 会在某个时候更新用户界面

  • 一些屏幕只有一个数据库调用,而某些屏幕有多个数据库调用。

    典型的数据库调用
    private Task<List<Product>> GetProductsAsync()
    {
    TaskCompletionSource<List<Product>> tcs = new TaskCompletionSource<List<Product>>();
    TaskEx.Run(() => tcs.SetResult(Repository.GetAllProducts()));
    return tcs.Task;
    }

    单次通话在屏幕上的使用情况
    // an event handler,can be marked as async void
    public override async void OnActivated()
    {
    base.OnActivated();
    ProductList = await GetProductsAsync();
    }

    屏幕上多次通话的使用情况
    // an event handler,can be marked as async void
    public override async void OnActivated()
    {
    base.OnActivated();
    ProductList = await GetProductsAsync();
    CustomerList = await GetCustomersAsync();
    OtherList = await GetOthersAsync();
    }

    如您所见,当前实现将通过多次调用从屏幕上的线程池中产生多个线程。这是正确的方法吗?

    另一种方法是在一个Task中检索所有数据,但这将导致在tcs.Result中检索一个列表数组,这从代码可读性的角度上还不清楚要检索的内容。

    您是否认为在自己的线程中执行每个数据库调用是正确的方法,如果不是,您的建议是什么?

    最佳答案

    当您使用async-await时,所有调用都可以在不同的线程上运行,但不一定同时(并发)。就您而言,所有调用都是连续的,因此您不会同时访问数据库。

    关于并发调用数据库,取决于数据库本身。大多数数据库可以同时处理多个调用,尤其是在不同的表上。但是,如果并发操作使用相同的锁,则可能会增加争用。可以采用任何一种方式,但是在大多数情况下,并发调用数据库是一件好事。

    关于GetProductsAsync,为什么要使用TaskCompletionSource而不是:

    private Task<List<Product>> GetProductsAsync()
    {
    return Task.Run(() => Repository.GetAllProducts());
    }

    关于c# - 执行多个数据库调用-单线程还是多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25377449/

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