我想知道如何在c#中检查异步任务的状态。 我有一个保存方法来保存用户,我想在保存后运行后台任务来更新它们。
我在框架4.0中,这是我开始任务的代码
System.Threading.Tasks.Task task = null;
task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
beginTask();
});
我的问题是任务需要一些时间才能结束(接近7分钟)所以如果有人做了几次用户保存,那么任务会运行几次,所以如果函数beginTask(),我想在运行任务之前检查一下已经运行,以避免有很多后台任务正在运行。
由于
答案 0 :(得分:4)
我想我找到了更好的解决方案。检查它是否适合你。
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()
)。
答案 1 :(得分:2)
也许尝试这样做 - 初始化您的任务对象:
public JsonResult IsAvailableUN(string Username)
{
var isExistUser = !Conn.Accounts.Any(Accounts => Accounts.Username == Username);
return Json(new { Result =isExistUser},JsonRequestBehavior.AllowGet);
}
并添加新方法来运行它,例如:
Task task = new Task(begintask);
当然,您可以根据任务状态添加更多条件。
答案 2 :(得分:1)
每个Task对象都有Task.Status类型的TaskStatus属性,如果您已经拥有任务对象,则可以查询该属性。它会告诉您任务是否正在运行,完成,取消等等。
如果要检查任何任务是否正在运行可能更难的特定功能块。一个可能的建议是保持一个Task变量可以全局访问,因为他们试图运行该代码所做的任何功能:
检查全局以查看是否正在运行。
如果 不创建新任务以运行它并将其分配给全局变量
否则执行你想要做的任何处理,如果它已经在运行(等待它可能完成?)
听起来你有点a)误解了一些任务,b)需要看看你的解决方案设计。
任务是表示要完成的工作的对象。任务不是BeginTask方法本身。 BeginTask方法或多或少只是一组要执行的指令。它没有任何状态。实现这些指令的各个任务确实具有可以查询的状态。
如果你想这样做,那么每个用户只能运行一个任务,你只需要在某个地方全局存储每个用户的一组任务(例如一个Key,其中Key是用户)。
理想情况下,这将创建并存储在包含此应用程序功能部分的某种管理类中,如果它是一个,则存储在外部程序中。
要参考你的评论"我需要避免在每次保存我的用户时创建一个新任务",为此你必须调整那段特定的代码来检查任何正在运行的任务的存储状态。因此,在上面的想法中,您可以更改该功能,以检查用户是否存在已保存在已开始任务的字典中的用户,如果存在,请检查其状态。
如果您不确定,请在评论中继续提问。也许如果您提供了有关系统如何处理的更多信息,我可以更好地提供帮助。
希望有所帮助。
答案 3 :(得分:1)
您可以使用媒体资源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();
});
}
此实施可以解决潜在问题的范围,如: