【发布时间】:2015-03-24 17:38:56
【问题描述】:
我有一个长时间运行的控制台应用程序(3 小时),在某些情况下我需要用异常杀死它。杀死这个批次的原因是它由操作员监控并由企业调度程序控制。未处理的异常会提醒他们,并通知待命支持人员使用的消息。
理想情况下,我希望后台线程作为 TPL 任务运行以检查这些数据库定义的标准,如果遇到则抛出异常以使进程失败。在任务中抛出异常不会杀死主线程。我尝试了以下方法,在 main 的调度程序上运行 ContinueWith 任务,但它不影响 main。
static void Main(string[] args)
{
var mainThread = TaskScheduler.Current;
var taskDb = new Task<bool>(RunDb, TaskCreationOptions.LongRunning);
var taskHandle = taskDb.ContinueWith(b => Check(b.Result), mainThread);
taskDb.Start();
//do stuff
}
static bool RunDb()
{
//check database in loop
//if validation failed return false
return false;
}
static void Check(bool successful)
{
//check database in loop
//if validation failed return false
if(!successful)
throw new Exception("batch failed for these reasons...");
}
我得到的唯一可能的解决方案是在 ContinueWith 操作中修改全局属性,并从主线程中查询该属性,引发异常。
我浏览了整个网络,虽然有很多关于从主线程中取消线程的内容,但没有关于从后台线程中杀死主线程的内容。
【问题讨论】:
标签: c# .net multithreading task-parallel-library task