0

目前我正在开发一个使用 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 任务的关键字,也不希望执行任何异步操作。我想知道,Tasks 的这种用法是否正确且不受异常影响?每当为属性 PollingTrigger 设置一个新值(每秒在此应用程序中)时,这是否会帮助我启动一个新线程?

我很抱歉这么详细的解释。我只是想把我的问题说清楚。我希望这很清楚。期待您的提示或答案!

4

3 回答 3

2

严格回答您的问题,这并不能保证您将有一个新线程。任务可以在线程池中的任意线程上执行,不保证是新的。

但是,这将确保操作不会在 UI 线程上运行,据我所知,您实际上想问什么。虽然它可能不是优雅或最有效的(不确定为什么需要那个整数),但它会起作用,可能足够好,甚至可能非常好,因为我对项目的其余部分没有洞察力。

于 2017-05-17T20:31:19.023 回答
1

你不必走Task路线。我不确定在未完成的任务上是否await-ing(或.Wait)是否泄漏资源(我认为它们应该被考虑,但不确定),但您可以简单地使用Timer将使用 ThreadPool 线程之一的类在设定的时间间隔内运行任意函数,这正是您想要的。更容易管理。.NET 提供了几个计时器,请参阅链接中的描述以了解区别。

于 2017-05-17T20:23:22.333 回答
0

正如@Ivan Ičin所说,使用Task并不能保证您获得新线程。您可以使用QueueUserWorkItem从线程池中获取可用线程,如果没有可用线程它将等待一个:

QueueUserWorkItem(ReadOrWriteDBTable);

但是,如果您正在寻找提高程序性能的方法,则必须使用asyncandawait而不是TaskThread因为它们(线程)会阻塞 I/O 操作,如套接字,并且您可以优化资源。

更新(6 月 12 日):根据 MSDN:

异步对于可能阻塞的活动至关重要,例如当您的应用程序访问 Web 时。访问网络资源有时很慢或延迟。

可以在此链接中阅读此信息:https ://msdn.microsoft.com/es-mx/library/hh191443(v=vs.110).aspx

而且,在您的情况下,继续谈论asyncand await,本文档讨论了将异步与 UI 结合使用:

当您使用异步方法时,应用程序会继续响应 UI。例如,您可以调整窗口大小或最小化窗口,或者如果您不想等待它完成,则可以关闭应用程序。

因此,如您所愿,使用异步方法可帮助您实现您正在寻找 UI 的行为,但是当您使用await运算符时,通过async方法,它将等待线程,直到async方法结束。

于 2017-05-17T23:08:59.150 回答