[英]How to check task status in c#
我想知道如何在c#中检查异步任务的状态。 我有一个保存方法来保存用户,并且我想在保存后运行一个后台任务来更新用户。
我在Framework 4.0中,这是我开始执行任务的代码
System.Threading.Tasks.Task task = null;
task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
beginTask();
});
我的问题是任务需要花费一些时间才能结束(将近7分钟),所以如果有人保存多个用户,则该任务将运行几次,因此我想在运行任务之前检查是否已经运行了beginTask()函数避免有很多后台任务在运行。
谢谢
我想我找到了更好的解决方案。 检查它是否适合您。
public class TaskDemo
{
private static AutoResetEvent autoReset = new AutoResetEvent(true);
Action beginTask = () =>
{
Console.WriteLine("Method start");
Thread.Sleep(2000);
};
public void RunTask()
{
Task myTask = Task.Run(() =>
{
autoReset.WaitOne();
beginTask();
}).ContinueWith(t => autoReset.Set());
}
}
只需进行控制台应用测试:
static void Main(string[] args)
{
TaskDemo td = new TaskDemo();
// Simulation multiple requests
Thread.Sleep(1000);
td.RunTask();
Thread.Sleep(1000);
td.RunTask();
Thread.Sleep(1000);
td.RunTask();
Thread.Sleep(1000);
td.RunTask();
Thread.Sleep(1000);
td.RunTask();
Thread.Sleep(1000);
td.RunTask();
}
提示是使用AutoResetEvent
来通知任务状态并
Task myTask = Task.Run(() =>
{
autoReset.WaitOne();
beginTask();
}).ContinueWith(t => autoReset.Set());
在运行期间和完成后更改其状态( ContinueWith(t => autoReset.Set()
)。
也许尝试用这种方式做-初始化任务对象:
Task task = new Task(begintask);
并添加新方法来运行它,例如:
public void StartTask(Task t)
{
if (t.Status == TaskStatus.Running)
return;
else
t.Start();
}
当然,您可以根据任务的状态添加更多条件。
每个任务对象具有Task.Status类型的财产TaskStatus可如果你已经有了任务对象进行查询。 它将告诉您任务是否正在运行,已完成,已取消等。
如果要检查是否有任何任务正在运行该特定功能块,则可能会更加困难。 出于这种原因,一个可能的建议是使Task变量在全局范围内可访问,并且每次他们尝试运行该功能时,代码都会这样做:
检查全局以查看是否正在运行。
如果 没有创建一个新的任务来运行它,并将其分配给全局变量
否则 ,如果它已经在运行,则执行您想做的任何处理(也许等待它完成?)
听起来您是a)有点误解的任务,并且b)需要看一下解决方案设计。
任务是代表要完成的工作的对象。 任务不是BeginTask方法本身。 BeginTask方法或多或少只是一组要执行的指令。 它没有任何状态。 实现这些指令的各个任务确实具有可以查询的状态。
如果要做到这一点,那么每个用户只能运行一个任务,则只需在全局某个位置存储每个用户的任务集合(例如以用户为键的字典)。
理想情况下,可以将其创建并存储在包含应用程序功能这一部分的某种管理类中,或者存储在外部程序中(如果有的话)。
为了引用您的评论“我每次保存用户时都需要避免创建新任务”,为此,您将必须修改该特定代码段以检查任何正在运行的Task的存储状态。 因此,在我上面的想法中,您将更改该功能,以检查要保存在已开始任务的词典中的用户是否存在任务,如果存在,请检查其状态。
如果您不确定,请继续在评论中提问。 也许,如果您提供有关该系统如何运行,结构化的更多信息,我会更好地提供帮助。
希望能有所帮助。
您可以使用属性Task.IsCompleted或TaskStatus
顺便说一下,尝试研究此方法Task.ContinueWith我认为使用Task.ContinueWith是解决多任务解决方案的更好方法。
请参阅下面的示例,该示例解释了我使用Task.ContinueWith的建议:
System.Threading.Tasks.Task task = null;
if (task==null)
{
task = Task.Factory.StartNew(() =>
{
beginTask();
});
return;
}
if (task.Status == TaskStatus.Running)
{
task.ContinueWith((x) =>
{
beginTask();
});
}else
{
task = Task.Factory.StartNew(() =>
{
beginTask();
});
}
此实现可以解决潜在问题的范围,例如:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.