目前我正在开发一个使用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属性设置一个新值(每秒在此应用程序中)时,这会帮助我启动一个新线程吗?
我很抱歉这么详细的解释。我只是想澄清我的问题。我希望它很清楚。期待您的提示或解答!
答案 0 :(得分:2)
要严格回答您的问题,这并不能保证您有新的主题。任务可以在线程池中的任何线程上执行,但不能保证是新线程。
然而,这将确保操作不会在UI线程上运行,这是我可以理解你真正想要问的内容。虽然它可能不是优雅或最有效(不确定为什么你需要那个整数),但它会起作用,可能足够好,甚至可能非常好,因为我对项目的其余部分没有洞察力。
答案 1 :(得分:1)
您不必走Task
路线。我不确定await
- (或.Wait
)是否有未完成的任务泄漏资源(我认为它们的意思是要考虑,但不确定),但你可以只需使用Timer
类,它将使用一个ThreadPool线程在设定的时间间隔内运行任意函数,这正是您想要的。更易于管理。 .NET提供了几个定时器,请参阅链接中的描述以进行区分。
答案 2 :(得分:0)
正如 @IvanIčin所说,使用Task
并不能保证您获得新的主题。您可以使用QueueUserWorkItem
从线程池中获取可用线程,如果没有可用线程,它将等待一个:
QueueUserWorkItem(ReadOrWriteDBTable);
但是,如果您希望提高计划的效果,则必须使用async
和await
代替Task
或Thread
,因为它们(主题)可以阻止I / O操作,如套接字,您可以优化资源。
更新(6月12日):根据MSDN:
异步对于可能阻塞的活动至关重要,例如当您的应用程序访问Web时。访问网络资源有时会很慢或延迟。
可以在以下链接中提取此信息:https://msdn.microsoft.com/es-mx/library/hh191443(v=vs.110).aspx
而且,在您的情况下并继续讨论async
和await
,本文档讨论了如何在UI中使用异步:
使用异步方法时,应用程序将继续响应UI。例如,您可以调整窗口大小或最小化窗口,或者如果您不想等待它完成,则可以关闭该应用程序。
因此,如您所愿,使用异步方法可以帮助您实现您正在寻找UI的行为,但是当您使用await
运算符时,使用async
方法,它会等待直到async
方法结束的线程。