2013-10-25 31 views
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是null在主線程內部,原因被填充到單獨的線程中。

由於這是我第一次嘗試使用線程工作,我看不出如何克服這一點。\

那你怎麼辦呢?

回答

2

使用新的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線程的執行流中。這真的很聰明,它是如何工作的,並且是一個非常優雅的解決方案。

-1

可以使用。加入()

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

這將等到回購繼續

+1

這將阻止主UI線程,顯然不是OP想要的東西 – synhershko