Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调度员在I';我已经停止了。C#UWP_C#_Uwp - Fatal编程技术网

调度员在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公开了,有什么地方改变了它吗?你可以创建一个新的空白应用程序,只需复制代码片段,如果它工作正常,你可能需要返回并仔细检查你的项目。我按照你的建议做了,制作了一个带有两个按钮、一个文本框和上述计时器的应用程序。单击每个按钮时,其名称显示在文本框中,触发计时器时,计时器显示“时间”。一切正常。这意味着程序其余部分中的某些内容导致了我的问题。至少我知道计时器应该工作,我正确地使用它,并且在应用程序的其余部分中有一些东西导致了这个问题。谢谢你的帮助。