目前我正在开发一个用C#开发的应用程序。我有一个关于任务的问题。 我已经完成了关于任务和异步编程主题的研究。但是在处理任务时,我仍然没有完全的信心。
此应用程序具有一种方法,即ReadOrWriteDBTable。此方法每秒对 SQL 表执行读取或插入操作。 基本上,此方法将每秒调用一次。目前,此方法与应用程序的 GUI 线程在同一线程上运行。一开始这不是问题,因为表中存在的数据非常少,但是随着表中数据数量的增加,可能会给 GUI 带来许多问题。因此,我想在与 GUI 线程不同的线程中执行这些数据库操作。
这意味着,每秒都应该通过一个新线程调用方法ReadOrWriteDBTable。这带来了多线程,我相信管理线程池变得困难。我从 TASKS 中了解到,多线程的所有复杂操作都完全由 TASK 处理。 所以我通过以下方式处理了上述使用 Tasks 进行多线程处理的问题。
public int PollingTrigger
{
get
{
return this.pollingTrigger;
}
set
{
this.pollingTrigger = value;
Task.Factory.StartNew(ReadOrWriteDBTable);
}
}
Public void ReadOrWriteDBTable()
{
// Database select and update….
}
每秒调用一次 PollingTrigger 属性,然后为该方法创建一个新任务 ReadOrWriteDBTable()。 由于我不需要从任务返回结果,因此我不对任务使用 Async 和 await 关键字,也不希望执行任何异步操作。 我想知道,任务的这种用法是否正确且不受异常影响?每当将新值设置为属性 PollingTrigger(在此应用程序中每秒)时,这会帮助我启动一个新线程吗?
我很抱歉有这么详细的解释。我只是想把我的问题说清楚。我希望它很清楚。期待您的提示或答案!
为了严格回答您的问题,这并不能保证您将拥有新线程。任务可以在线程池中的任何线程上执行,不能保证是新线程。
但是,这将确保该操作不会在UI线程上运行,据我所知,您实际上想问什么。虽然它可能不是优雅或最有效的(不确定为什么你需要那个整数),但它会工作,可能足够好,甚至可能非常好,因为我对项目的其余部分没有洞察力。
你不必走Task
路线。 我不确定未完成任务的await
-ing(或.Wait
)是否会泄漏资源(我认为它们应该被考虑,但不确定),但您可以简单地使用Timer
类将使用其中一个 ThreadPool 线程在设定的时间间隔内运行任意函数,这正是您想要的。更易于管理。 .NET 提供了多个计时器,请参阅链接中的说明以进行区分。
正如@Ivan Ičin所说,使用Task
并不能保证你得到一个新的线程。您可以使用QueueUserWorkItem
从线程池中获取可用线程,如果没有可用线程,它将等待一个线程:
QueueUserWorkItem(ReadOrWriteDBTable);
但是,如果您正在寻找提高程序性能的方法,则必须使用async
和await
而不是Task
或Thread
,因为它们(线程)可以阻止 I/O 操作,如套接字,并且您可以优化资源。
更新(6月12日):根据MSDN:
异步对于可能阻塞的活动(例如应用程序访问 Web 时)至关重要。对 Web 资源的访问有时会很慢或延迟。
可以在以下链接中读取此信息:https://msdn.microsoft.com/es-mx/library/hh191443(v=vs.110).aspx
而且,在您的情况下,继续谈论async
和await
,本文档讨论如何使用 UI 异步:
使用异步方法时,应用程序将继续响应 UI。例如,您可以调整窗口大小或最小化窗口,或者如果您不想等待应用程序完成,则可以关闭应用程序。
因此,如您所愿,使用异步方法可以帮助您实现您正在寻找 UI 的行为,但是当您使用await
运算符和async
方法时,它将等待线程直到async
方法结束。