繁体   English   中英

如何在C#中检查任务状态

[英]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.IsCompletedTaskStatus

顺便说一下,尝试研究此方法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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM