调度员在I';我已经停止了。C#UWP
我在使用以下代码时遇到问题。我有一些代码调用调度员在I';我已经停止了。C#UWP,c#,uwp,C#,Uwp,我在使用以下代码时遇到问题。我有一些代码调用SetTimer(),希望用户在到达interval之前做出响应(在 毫秒)。调用代码继承这些函数。如果用户响应,则调用StopTimer(),显示信息,StartTimer()被调用,并且预期用户将在时间间隔内再次响应。直到用户回答失败或时间过长(超过时间间隔)为止 问题是计时器不停。即使在我停止它们之后,它们仍会不断重复,将它们的勾选事件设置为空(通过-=方法),并离开其范围。我甚至用一个新的分派器获得了新的存储(我每次都使用旧的和新的)。我无法让
SetTimer()
,希望用户在到达interval
之前做出响应(在
毫秒)。调用代码继承这些函数。如果用户响应,则调用StopTimer()
,显示信息,StartTimer()
被调用,并且预期用户将在时间间隔内再次响应。直到用户回答失败或时间过长(超过时间间隔
)为止
问题是计时器不停。即使在我停止它们之后,它们仍会不断重复,将它们的勾选
事件设置为空
(通过-=
方法),并离开其范围。我甚至用一个新的分派器获得了新的存储(我每次都使用旧的和新的)。我无法让旧的计时器消失
我做错了什么
using Windows.UI.XAML;
public DispatcherTimer GameTimer;
internal void SetTimer(int interval)
{
GameTimer = new DispatcherTimer();
GameTimer.Tick += TimerCallback;
GameTimer.Interval = new TimeSpan(0,0,0,0,interval);
GameTimer.Start();
}
internal void StopTimer()
{
GameTimer.Stop();
try
{
GameTimer.Tick -= TimerCallback;
} catch {}
}
private void TimerCallback(object sender, object e)
{
StopTimer();
// Other code
}
提前感谢,
-justin尝试使用sender对象而不是实际的公共计时器对象停止计时器:
private void TimerCallback(object sender, object e) {
(sender as DispatcherTimer).Stop();
// Other code
}
作为解决方法,您可以执行以下操作:
// in your class
private bool _allowExecution = false;
然后,无论何时开始设置时间\u allowExecution=true
并且当您停止计时器时,只需添加\u allowExecution=false代码>
最后一件事是在计时器执行中添加一个简单的布尔条件:if(\u allowExecute)//在这里做你的事情
,因为每次调用SetTimer(int interval)
时都要初始化一个新的调度程序。在初始化新实例之前,必须停止旧的Dispatchermer
实例
internal void SetTimer(int interval)
{
StopTimer();
GameTimer = new DispatcherTimer();
GameTimer.Tick += TimerCallback;
GameTimer.Interval = new TimeSpan(0,0,0,0,interval);
GameTimer.Start();
}
internal void StopTimer()
{
if(GameTimer != null)
{
GameTimer.Stop();
GameTimer.Tick -= TimerCallback;
GameTimer = null;
}
}
`{}catch{}`只是一种坏习惯。记录或不捕获以确定发生了什么。是否尝试使用System.Windows.Threading.dispatchermer
。我正在运行类似的代码,并没有问题停止它。我会尝试Windows.UI.XAML.DispatchTimer
,但没有Windows 10开发框。我认为为了使用System.Windows.Threading
,我必须安装WindowsBase
作为参考,我认为UWP应用程序不可能安装它,或者至少我还没有发现怎么做。我还需要从外部停止计时器——当用户在时间限制内应答时。因此外部代码需要调用StopTimer()并使其工作。这并没有解决它。但是谢谢你的帮助。我已经尝试了两种方法,初始化一个新的“Dispatchermer”或者在类第一次安装时重用一个设置。这似乎无关紧要:“GameTimer.Stop()”不起作用。我精确地复制了这段代码,但它也不起作用。@JustinBurns我注意到你把GameTimer公开了,有什么地方改变了它吗?你可以创建一个新的空白应用程序,只需复制代码片段,如果它工作正常,你可能需要返回并仔细检查你的项目。我按照你的建议做了,制作了一个带有两个按钮、一个文本框和上述计时器的应用程序。单击每个按钮时,其名称显示在文本框中,触发计时器时,计时器显示“时间”。一切正常。这意味着程序其余部分中的某些内容导致了我的问题。至少我知道计时器应该工作,我正确地使用它,并且在应用程序的其余部分中有一些东西导致了这个问题。谢谢你的帮助。