【问题标题】:Using System.Timers.Timer in winforms Presenter在 winforms Presenter 中使用 System.Timers.Timer
【发布时间】:2013-10-29 05:23:40
【问题描述】:

如何在 Presenter 中设置 System.Timers.Timer 以便在视图线程中消逝?

环境:C#、.NET 4.0 CP、WinForms

我目前的鳕鱼在这里,但它不起作用。我必须在视图中另外“调用”。

我将视图投射到 ISynchronizeInvoke 以构建代码。投射到 Control 没有帮助。

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 的评论(神秘地消失了)。我将 SynchronizingObject 设置为参数。它工作正常,但代码看起来有些奇怪。

    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;
    }

View调用该方法如下:

        presenter.SetView(this, this);

【问题讨论】:

  • 您能否更具体地了解doesn't work?有什么例外吗?
  • 视图中有“对象已从其他线程更改”或类似内容。
  • 你为什么不用System.Windows.Forms.Timer
  • 这是我的第一个想法,但 View 是否应该通知 Presenter 提示?

标签: c# .net winforms timer


【解决方案1】:

问题是您必须在某处切换同步上下文。这种情况下的 ViewModel 应该在 UI Thread 中创建。

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);                
}

【讨论】:

  • 这段代码也会出现异常“Cross-thread operation not valid...”View和Presenter是由UnityContainer创建的。
  • 如果 SynchronizationContext.Current 未设置,则会引发异常。检查这个线程:stackoverflow.com/questions/9377290/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2013-12-06
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多