2013-10-28 42 views
0

如何在演示者中設置System.Timers.Timer以便在視圖線程中消逝?在winforms中使用System.Timers.Timer Presenter

環境:C#,.NET 4.0 CP,WinForms的

我現在的鱈魚是在這裏,但它不工作。我必須另外在視圖中「調用」。

我將視圖轉換爲ISynchronizeInvoke以構建代碼。投到控制不起作用。

public class GeneratorPagePresenter : IGeneratorPagePresenter 
{ 
    private IGeneratorPage view; 
    private Timer timer; 

    public void SetView(IGeneratorPage generatorPage) 
    { 
     view = generatorPage; 

     timer = new Timer(); 
     timer.Interval = 1000; 
     timer.AutoReset = true; 
     timer.SynchronizingObject = (ISynchronizeInvoke) view; 
     timer.Elapsed += Timer_Elapsed; 
    } 

    void Timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     view.UpdateProgress(percentage); 
    } 
} 

編輯

感謝AnPasant評論(這神祕disapeared)。我將SynchronizingObject設置爲參數。它工作正常,但代碼看起來很奇怪。

 presenter.SetView(this, this); 
+0

你可以更具體的'不工作'?有沒有例外? –

+0

在視圖中有「對象從其他線程改變」或類似的東西。 –

+0

爲什麼不使用'System.Windows.Forms.Timer'? –

回答

0

的事情是,你必須從某個地方切換同步上下文:

public void SetView(IGeneratorPage generatorPage, ISynchronizeInvoke sync) 
    { 
     view = generatorPage; 

     timer = new Timer(); 
     timer.Interval = 1000; 
     timer.AutoReset = true; 
     timer.SynchronizingObject = sync; 
     timer.Elapsed += Timer_Elapsed; 
    } 

這種方法是通過查看如下調用。在這種情況下,ViewModel將在UI線程中創建。

private IGeneratorPage view; 
private Timer timer; 
private SynchronizationContext uiSyncContext; 

public GeneratorPagePresenter() 
{ 
    uiSyncContext = SynchronizationContext.Current; 
} 

public void SetView(IGeneratorPage generatorPage) 
{ 
    view = generatorPage; 

    timer = new Timer(); 
    timer.Interval = 1000; 
    timer.AutoReset = true; 
    timer.Elapsed += Timer_Elapsed; 
} 

void Timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    uiSyncContext.Post((state) => view.UpdateProgress(percentage), null);     
} 
+0

此代碼也異常出現「Cross-thread operation not valid ...」 View and Presenter由UnityContainer創建。 –

+0

如果未設置SynchronizationContext.Current,則會引發異常。檢查此線程:http://stackoverflow.com/questions/9377290/synchronizationcontext-current-is-null-on-resolving-with-unity-in-wpf –

相關問題