在Windows窗体应用程序中,我使用Quartz.NET每隔几分钟运行一些任务。以前,这个应用程序是一个基于时间表调用的控制台应用程序,但由于各种原因,这并不理想 - 然后所有调试信息都输出到控制台。
在这个版本中,我需要一种在用户屏幕上显示作业调试信息的方法。我最初的想法是在运行作业时显示的新表单,并且所有调试信息都附加到该表单上的多行文本框中。但是,这不起作用,因为当我这样做时,大多数应用程序似乎都崩溃了。
还有其他想法吗?
编辑:抱歉有任何困惑。这是作业执行时调用的内容: public virtual void Execute(JobExecutionContext context)
{
RunJob jobForm = new RunJob();
jobForm.Show();
jobForm.JobLabel = context.JobDetail.JobDataMap.GetString("Name");
for (int i = 0; i < 100; i++)
{
jobForm.WriteLine(i.ToString());
}
jobForm.Hide();
}
这是'RunJob'形式的内容:
public partial class RunJob : Form
{
public string JobLabel
{
get
{
return lblJobName.Text;
}
set
{
lblJobName.Text = value;
}
}
public void WriteLine(string text)
{
textBox1.AppendText(text + Environment.NewLine);
}
public RunJob()
{
InitializeComponent();
}
}
基本上,RunJob窗口在附加文本时冻结,理想情况下它只是平滑地添加文本。我理解'崩溃'是一个非常糟糕的选择!我的理由是,它是凌晨,嗯嗯
答案 0 :(得分:0)
我在上面的代码中没有看到任何可能导致死锁或其他任何内容的错误,除了这一行:jobForm.JobLabel = context.JobDetail.JobDataMap.GetString("Name");
这条线做了什么,这一行肯定有问题,
尝试使用一些硬编码字符串而不是context.JobDetail.JobDataMap.GetString("Name");
并告诉我它是否仍然无法正常工作。
答案 1 :(得分:0)
作业和UI表单显然应该位于不同的线程中。作业线程应写入表单,然后在不需要时关闭它。
假设您有一个在UI线程上调用的Action操作:
public virtual void Execute(JobExecutionContext context)
{
RunJob jobForm;
var name = context.JobDetail.JobDataMap.GetString("Name");
action(()=> { jobForm = new RunJob(); jobForm.Show(); jobForm.JobLabel = name;});
for (int i = 0; i < 100; i++)
{
var txt = i.ToString();
action(()=>{ jobForm.WriteLine(txt); });
}
action(()=> { jobForm.Hide(); });
}