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

在C#编程中使用任务启动新线程,c#,multithreading,task,taskfactory,C#,Multithreading,Task,Taskfactory,目前我正在开发一个用C#开发的应用程序。我有一个关于任务的问题。我做了关于任务和异步编程的研究。但在处理任务时,我仍然没有完全的信心 此应用程序有一个方法,即ReadOrWriteDBTable。此方法每秒对SQL表执行读取或插入操作。基本上,每秒都会调用此方法。当前,此方法与应用程序的GUI线程在同一线程上运行。一开始这不是问题,因为表中的数据会非常少,但是随着表中数据量的增加,它会给GUI带来很多问题。因此,我希望在不同于GUI线程的线程中执行这些数据库操作 这意味着,每秒都应该通过一个新线

目前我正在开发一个用C#开发的应用程序。我有一个关于任务的问题。我做了关于任务和异步编程的研究。但在处理任务时,我仍然没有完全的信心

此应用程序有一个方法,即ReadOrWriteDBTable。此方法每秒对SQL表执行读取或插入操作。基本上,每秒都会调用此方法。当前,此方法与应用程序的GUI线程在同一线程上运行。一开始这不是问题,因为表中的数据会非常少,但是随着表中数据量的增加,它会给GUI带来很多问题。因此,我希望在不同于GUI线程的线程中执行这些数据库操作

这意味着,每秒都应该通过一个新线程调用ReadOrWriteDBTable方法。这带来了多线程,我相信管理线程池会变得很困难。我从任务中了解到,多线程的所有复杂操作都完全由一个任务处理。 因此,我用以下方法处理了上面的多线程问题

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属性设置了一个新值时(在这个应用程序中,每隔一秒钟),这会帮助我启动一个新线程吗


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

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

您不必执行任务。我不确定未完成任务上的not
Wait
-ing(或
.Wait
)是否会泄漏资源(我认为它们应该被解释,但不确定),但您可以简单地使用一个类,该类将使用一个线程池线程在设置的时间间隔上运行任意函数,这正是您想要的。更容易管理。NET提供了多个计时器,请参见链接中的说明以了解区别。

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


然而,这将确保操作不会在UI线程上运行,这是我所能理解的,您实际上想要问什么。虽然它可能不是优雅的或最有效的(不确定您为什么需要该整数),但它会工作,可能足够好,甚至可能非常好,因为我对项目的其余部分没有深入了解。

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


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

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

QueueUserWorkItem(ReadOrWriteDBTable);
但是,如果您希望提高程序的性能,则必须使用
async
wait
而不是
Task
Thread
,因为它们(线程)可以阻止I/O操作,如套接字,并且您可以优化资源

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

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

此信息可在以下链接中读取:

而且,在您的情况下,继续谈论
async
wait
,本文档将讨论如何在UI中使用async:

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


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

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

QueueUserWorkItem(ReadOrWriteDBTable);
但是,如果您希望在程序中提高性能,则必须使用
async
wait
而不是
Task
Thread
,因为它们(线程)可以阻止I/O操作