在分离线程中初始化存储库问题

本文关键字:存储 问题 初始化 分离 线程 | 更新日期: 2023-09-27 18:36:59

Inside MainForm.cs 我正在初始化一些东西(IBookRepository 和 IDocumentStore)。

private IDocumentStore _store = new EmbeddableDocumentStore {RunInMemory = false };
private IBookRepository _repository;
public MainForm()
{
    InitializeComponent();
    _store.Initialize();
    _repository = new RavenDbBookRepository(_store);
}

由于可嵌入的文档存储需要一段时间(5,6 秒)才能初始化,我想将其初始化移动到单独的线程上

所以我试了

 private void InitOnNewThread()
    {
        _store.Initialize();
        _repository = new RavenDbBookRepository(_Store);            
    }
public MainForm()
{
    InitializeComponent();
    Thread t = new Thread(new ThreadStart(InitOnNewThread));
    t.Start();
}

但是使用此_repository在主线程内为空,原因填充在单独的线程中。

由于这是我第一次尝试使用线程,因此我不知道如何克服这个问题。

你会怎么做?

在分离线程中初始化存储库问题

使用新的asyncawait关键字。

public class MainForm : Form
{
  private IDocumentStore _store = new EmbeddableDocumentStore {RunInMemory = false };
  private IBookRepository _repository;
  private async void MainForm_Load(object sender, EventArgs args)
  {
    // Do stuff here that does not depend on _store or _repository.
    await InitializeRepositoryAsync();
    // Now you can use _store and _repository here.
  }
  private Task InitializeRepositoryAsync()
  {
    return Task.Run(
      () =>
      {
        _store.Initialize();
        _repository = new RavenDbBookRepository(_store);
      };
  }
}

关于await如何工作的巧妙之处在于,当任务在后台异步运行时,它将抢占MainForm_Load的执行。任务完成后,MainForm_Load的剩余部分将注入回 UI 线程的执行流中。这确实非常聪明,并且是一个非常优雅的解决方案。

您可能希望阅读一些有关单例模式以及在多线程环境中使用它的信息。

既然你提到RavenDB的DocumentStore,你可能会发现这个很方便:http://ayende.com/blog/160161/managing-ravendb-document-store-startup。与在应用程序加载时执行此操作相比,延迟初始化文档存储是一个不错的选择。

您可以使用

.连接()

public MainForm()
{
    InitializeComponent();
    Thread t = new Thread(new ThreadStart(InitOnNewThread));
    t.Start();
    t.Join();
}

这将等到存储库准备就绪后再继续