C# 定时器不工作';";“循环”;
好吧,就这样吧。我正在尝试制作一个GUI应用程序,但它没有GUI。因此,当应用程序启动时,它有一个带有登录屏幕的小表单(我已经完成了这一部分) 这是运行表单的C# 定时器不工作';";“循环”;,c#,timer,C#,Timer,好吧,就这样吧。我正在尝试制作一个GUI应用程序,但它没有GUI。因此,当应用程序启动时,它有一个带有登录屏幕的小表单(我已经完成了这一部分) 这是运行表单的main()的代码,但一旦关闭它,我就会处理它 static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);
main()
的代码,但一旦关闭它,我就会处理它
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Create an instance of form1
Form1 form1 = new Form1();
Application.Run(form1);
if(form1.isLoggedIn)
{
filename = Path.Combine(Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), DateTime.Now.ToString("ddMMyyhhmm") + "-" + form1.username);
Flow palm = new Flow(new FlowArguments(form1.username, filename));
MessageBox.Show("Thankyou, exiting...");
form1.Dispose();
}
}
因此,正如您在表单关闭后所看到的,如果有人登录,则main将继续。如果仔细观察,就会发现创建的流
类有一个实例
这是一节很短的课,现在我们开始:
public class Flow
{
//global variables
FlowArguments FlowArgs;
System.Threading.Timer tm;
//constructor
public Flow(FlowArguments fmg)
{
FlowArgs = fmg;
tm = new System.Threading.Timer(Tick, null,
System.Threading.Timeout.Infinite, 10000);
using(StreamWriter sw = new StreamWriter(FlowArgs.Filename))
{
//sw.writelines that SO doesnt really care for.
}
//enable the timer
tm.Change(0, 100);
}
public void Tick(object State)
{
Console.WriteLine("Hello");
//a bunch of SteamWriter writeline methods that SO doesnt care for.
}
public void WriteProcesses(StreamWriter sw, DateTime dw)
{
var localAll = Process.GetProcesses().Where(o => o.ProcessName.ToLower() != "svchost");
foreach(Process p in localAll)
{
sw.WriteLine("@" + p.ProcessName +
"[" + dw.ToString("ddMMyyhhmm") + "]" +
"[" + FlowArgs.Username + "]");
}
}
}
如你所见,我确实启动了计时器。但由于这使用了System.Threading.Timer
(因为我在某处读到Form.Timer
确实不合适),它在线程池上运行(根据MSDN),但在发生这种情况时,主窗体现在已退出main()
,因此程序关闭
我可能的解决方案是什么?此计时器将每10分钟运行一次(抓取进程)。关闭GUI后,我计划制作一个系统图标托盘,用户可以用它来关闭程序。如果要让前台线程等待,可以使用WaitHandle
如果要使前台线程等待,可以使用WaitHandle
谢谢,这正是我所需要的,所以这就是我所实施的:
if(form1.isLoggedIn) {
//Create a wait handle for the UI thread.
AutoResetEvent hold = new AutoResetEvent(false);
filename = Path.Combine(Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), DateTime.Now.ToString("ddMMyyhhmm") + "-" + form1.username);
Flow palm = new Flow(new FlowArguments(form1.username, filename), hold);
//wait for the background thread to finish.
hold.WaitOne(Timeout.Infinite);
MessageBox.Show("Thankyou, exiting...");
form1.Dispose();
}
正如您所见,它将AutoResetEvent的引用(来自MSDN Timer类示例)传递给流类的构造函数。从那里我可以调用“set”方法来释放等待的线程。我现在明白了
然而
hold.WaitOne(Timeout.Infinite);
等待不确定的时间。。我想向Flow类发送一个“命令”来停止计时器并调用waithandle上的“set”方法,以便UI线程可以退出
如何发送“信号”
注意:我还没有决定将系统托盘图标放在哪里。因此,如果我更容易将其放在Flow类中,我会这样做。谢谢,这就是我所需要的,这就是我实现的:
if(form1.isLoggedIn) {
//Create a wait handle for the UI thread.
AutoResetEvent hold = new AutoResetEvent(false);
filename = Path.Combine(Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), DateTime.Now.ToString("ddMMyyhhmm") + "-" + form1.username);
Flow palm = new Flow(new FlowArguments(form1.username, filename), hold);
//wait for the background thread to finish.
hold.WaitOne(Timeout.Infinite);
MessageBox.Show("Thankyou, exiting...");
form1.Dispose();
}
正如您所见,它将AutoResetEvent的引用(来自MSDN Timer类示例)传递给流类的构造函数。从那里我可以调用“set”方法来释放等待的线程。我现在明白了
然而
hold.WaitOne(Timeout.Infinite);
等待不确定的时间。。我想向Flow类发送一个“命令”来停止计时器并调用waithandle上的“set”方法,以便UI线程可以退出
如何发送“信号”
注意:我还没有决定将系统托盘图标放在哪里。因此,如果我更容易将其放入Flow类中,我会这样做。删除所有线程内容,并以实现系统托盘图标的形式完成所有操作。把你的计时器放在那个表格里,你想要的一切都完成了 差不多
LoginForm login = new LoginForm();
if(login.ShowDialog()==DialogResult.OK)
{
Application.Run(new SystemTrayForm());
}
删除所有线程内容,并以实现系统托盘图标的形式完成所有操作。把你的计时器放在那个表格里,你想要的一切都完成了 差不多
LoginForm login = new LoginForm();
if(login.ShowDialog()==DialogResult.OK)
{
Application.Run(new SystemTrayForm());
}
我会的,但我正在尝试快速处理内存。这是因为当一个全屏游戏正在玩的时候,这个程序将在后台运行。我会的,但我正在尝试快速处理内存。这是因为当全屏游戏正在进行时,这个程序将在后台运行。