2

在 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 是空的,原因是在单独的线程中填充。

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

你会怎么做?

4

3 回答 3

2

使用 newasyncawait关键字。

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 线程的执行流中。这真的很聪明,它是如何工作的,并且是一个非常优雅的解决方案。

于 2013-10-25T14:42:53.730 回答
1

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

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

于 2013-10-25T11:30:52.873 回答
-1

您可以使用 .Join()

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

这将等到 repo 准备好后再继续

于 2013-10-25T11:14:29.397 回答