110,502
社区成员
发帖
与我相关
我的任务
分享
static void Main(string[] args)
{
business.Hardwork();
// 预期效果是,Hardwork执行完毕后,如果在3s内完成,退回主程序,如果3s没有完成,在3s时强制退出
Console.WriteLine("\nBACK TO THE MAIN PROCESS!");
Console.ReadLine();
}
class business {
static bool bok = false; // 标识 复杂任务是否已经执行完成
static bool br = false; // 标识 复杂任务是否执行中
public static bool Hardwork()
{
var cts = new CancellationTokenSource(); //增加取消消息源
Task hardtask = Task.Run(() => { //启动这个hardtask,并使用 cts.token来接受取消的消息
int i=0;
while(!bok) { //
if (cts.Token.IsCancellationRequested)
cts.Token.ThrowIfCancellationRequested();
if (!br) // 如果费时的工作还没有运行,则执行如下,执行完毕后会更改bok的状态。
{
// 下面这个是费时工作,业务中是顺序执行,没办法轮询
Task.Factory.StartNew(() => { //这个就是费时的工作,结束后其会把bok设置为true,由于是顺序执行,没办法进行状态的轮询啊?
br = true;
Console.WriteLine("hard working");
Thread.Sleep(5000);
Console.WriteLine("hard work finished");
bok = true;
Console.WriteLine("hw bok:" + bok);
});
}
Thread.Sleep(100); //休息100ms,打印一下bok是否完成状态,并去检查一下cts.Token.IsCancellationRequested
Console.WriteLine(i++ + "bok: " + bok);
}
Console.WriteLine("fffinish");
}, cts.Token);
cts.CancelAfter(3000); // 3000ms以后,发出取消任务
try
{
hardtask.Wait(); //等待hardtask完成,约3000ms后收到完成信号,退出。
}
catch (AggregateException ae)
{
foreach (Exception e in ae.InnerExceptions)
{
if (e is TaskCanceledException)
Console.WriteLine(e.GetType() +": {0}",
((TaskCanceledException)e).Message);
else
Console.WriteLine("Exception: " + e.GetType().Name);
}
//Console.WriteLine(ae.GetType() + ae.Message);
//Console.WriteLine(task.Status);
}
Console.WriteLine("hardtask:" + t2.Status);
Console.WriteLine("bokk:" + bok);
return bok;
}
}
private System.Threading.Timer t;
private void cancelJob(object obj)
{
Thread tempT = (Thread)obj;
if(tempT.IsAlive)
{
if (listBox1.InvokeRequired)
{
listBox1.Invoke(new Action(() => listBox1.Items.Add("作业将被取消...")));
}
t.Dispose();
//做好强行中断线程前的准备工作,如回滚业务逻辑等
tempT.Abort();
}
}
private void bigJob()
{
if(listBox1.InvokeRequired)
{
listBox1.Invoke(new Action(() => listBox1.Items.Add("开始处理大型作业...")));
}
Thread.Sleep(5000); //模拟耗时操作
}
private void button1_Click(object sender, EventArgs e)
{
Thread asyncJob = new Thread(bigJob);
asyncJob.Start();
TimerCallback tCallBack = new TimerCallback(cancelJob);
t = new System.Threading.Timer(tCallBack, asyncJob, 3000, 0); //3秒后启动回调函数tCallBack
listBox1.Items.Add("主线程处理其他业务中...");
}
效果
Task.WaitAny(task,Task.Run(()=>{Thread.Sleep(500000);}))
根据返回的index确认是哪个task执行完了,如果不是你的task,则设置CancellationToken