使用任务在C#编程中启动新线程

时间:2017-05-17 20:09:31

标签: c# multithreading task taskfactory

目前我正在开发一个使用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属性设置一个新值(每秒在此应用程序中)时,这会帮助我启动一个新线程吗?

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

3 个答案:

答案 0 :(得分:2)

要严格回答您的问题,这并不能保证您有新的主题。任务可以在线程池中的任何线程上执行,但不能保证是新线程。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

QueueUserWorkItem(ReadOrWriteDBTable);

但是,如果您希望提高计划的效果,则必须使用asyncawait代替TaskThread,因为它们(主题)可以阻止I / O操作,如套接字,您可以优化资源。

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

  

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

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

而且,在您的情况下并继续讨论asyncawait,本文档讨论了如何在UI中使用异步:

  

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

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