在 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为空,原因是在单独的线程中填充。
因为这是我第一次尝试使用线程,所以我不知道如何克服这个问题。\
你会怎么做?
最佳答案
使用新的 async
和 await
关键字。
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
的剩余部分将被注入(inject)回 UI 线程的执行流中。它的工作原理确实非常聪明,并且是一个非常优雅的解决方案。
关于c# - 在分离线程问题中初始化存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19587670/