【发布时间】:2011-05-16 08:09:05
【问题描述】:
我有一个多线程应用程序,并且基于 propertychange 我想做一些操作,所以我为此创建了一个事件处理程序并从一个线程更改了属性,但是当事件触发时,我仍然尝试访问表单事件处理程序方法 Visual Studio 中的元素抱怨已完成跨线程访问。我不明白为什么它被视为跨线程。这是我的代码,
public delegate void AppStateChangedEventHandler(int st);
public event AppStateChangedEventHandler AppStateChanged;
private int appState;
public int AppState
{
get { return this.appState; }
set
{
this.appState = value;
if (this.AppStateChanged != null)
{
this.AppStateChanged(value);
}
}
}
public void MainForm_AppStateChanged(int val)
{
if (val == 1)
{
totDwn.Text = "00:00:00";
totAct.Text = "00:00:00";
}
else if (val == 0)
{
tt.Reset();
sw.Reset();
}
}
我添加的initializecomponent方法内部
this.AppStateChanged += new AppStateChangedEventHandler(this.MainForm_AppStateChanged);
从线程内部我将 appstate 属性更改为
this.AppState = 1;
现在有两个问题
1)第一个也是重要的是 vs 抱怨说,即使我正在从事件处理程序访问 GUI 元素,也正在执行跨线程操作。(我知道如何使用所需的调用和委托来处理这个问题,但我只需要知道为什么会这样)
2)VS 不断警告 AppStateChanged 事件不是 Windows.form 的一部分。
第一个问题是真正让我恼火的是什么?对此有任何想法。
【问题讨论】:
-
使用invoke