我正在尝试制作一个可以关闭的游戏启动器,限制为10分钟
问题陈述:我要加载表单,用户应该能够进行活动,然后应用程序应在10分钟后关闭
当我在主要方法中进行任何睡眠或等待时,表单本身未加载,我仅收到消息框,然后应用程序关闭。
public MainForm()
{
InitializeComponent();
MessageBox.Show("Welcome");
Task.Run(async () =>
{
await Task.Delay(60000);
}).GetAwaiter().GetResult();
MessageBox.Show("one minute left");
Task.Run(async () =>
{
await Task.Delay(60000);
}).GetAwaiter().GetResult();
MessageBox.Show("time over");
Application.Exit();
}
答案 0 :(得分:1)
按如下方式使用System.Windows.Forms.Timer
:
Timer = new System.Windows.Forms.Timer();
Timer.Interval = TIME_IN_MILLISECONDS;
Timer.Tick += Timer_Tick;
private void Timer_Tick(object sender, EventArgs e)
{
//desired behavior
}
系统计时器异步运行,在选定的间隔后它将触发您的方法
答案 1 :(得分:1)
使用Microsoft的Reactive Framework(NuGet“ System.Reactive.Windows.Forms”并添加float sizeInPixels = getResources().getDimension(R.dimen.my_value);
),然后您可以执行以下操作:
using System.Reactive.Linq;
答案 2 :(得分:0)
如果要以class App extends React.Component {}
的方式启动任务,则无需调用fire and forget
,因为这会阻塞线程。因此,基本上,您创建的所有这些任务都没有意义。您可以简单地使用GetAwaiter().GetResult();
。使用Timer
时,可以使用Windows Forms
或System.Windows.Forms.Timer
。我将使用System.Threading.Timer
来实现这种行为。
答案 3 :(得分:0)
为什么不只是从事件处理程序安排任务:
private async void OnApplicationStarted(object sender, RoutedEventArgs e)
{
await Task.Delay((int)TimeSpan.FromMinutes(9).TotalMilliseconds);
MessageBox.Show("1 minute left");
await Task.Delay((int)TimeSpan.FromMinutes(1).TotalMilliseconds);
MessageBox.Show("time over");
Application.Exit();
}
答案 4 :(得分:0)
我将Form.Load事件与异步事件处理程序一起使用。这已经显示了您的表单,因此用户将能够看到该程序已启动。
async void OnFormLoading(object sender, ...)
{
// Notify the operator that the form is loading:
this.ShowSplashScreen();
// start the delay, but do not wait yet
Task delayTask = Task.Delay(TimeSpan.FromSeconds(5));
// do other useful initializations, this might be shorter or longer than 5 seconds
DoOtherInitializations();
// now wait for the delay task to finish:
await delayTask;
this.HideSplashScreen();
}
或者更好的方法:显示一个启动表单,该表单显示您正在启动,并且只能取消:
在MainForm类中:
private async void OnFormLoading(object sender, ...)
{
// show an intro screen while doing initializations:
using (var startupForm = new FormStartup()
{
var dlgResult = startupForm.ShowDialog(this);
if (dlgResult == DialogResult.Cancel)
{
// operator cancelled starting up:
this.Close();
}
else
{
// continue starting up
}
}
}
}
}
class FormStartup
{
public void FormStartup() {...}
private async void OnFormLoading(object sender, ...)
{
Task delayTask = Task.Delay(TimeSpan.FromSeconds(5));
DoOtherInitializations();
await delayTask;
}
}