C# 在方法中启动一个新线程是一个好的实践吗

C# 在方法中启动一个新线程是一个好的实践吗,c#,multithreading,C#,Multithreading,我有一个定义如下的类,Stop()函数只是想看看数据是否保存。如果它被保存,那么它将删除数据,否则,它将启动一个新线程来保存数据(因为数据可能非常大,并且需要花费很多时间来保存)。我想知道这样开始一个新的线程是否是一个好的实践。如果线程中发生异常,我如何处理它?如果保存需要很长时间,如果用户关闭应用程序会发生什么?这对我来说似乎不是一个好的做法,但我不知道我是否正确。如果不好,还有什么更好的方法?谢谢 public class AHelperClass { public

我有一个定义如下的类,Stop()函数只是想看看数据是否保存。如果它被保存,那么它将删除数据,否则,它将启动一个新线程来保存数据(因为数据可能非常大,并且需要花费很多时间来保存)。我想知道这样开始一个新的线程是否是一个好的实践。如果线程中发生异常,我如何处理它?如果保存需要很长时间,如果用户关闭应用程序会发生什么?这对我来说似乎不是一个好的做法,但我不知道我是否正确。如果不好,还有什么更好的方法?谢谢

public class AHelperClass
    {
        public void Stop()
        {                
            if (IsDataSaved)
            {
                DeleteData();
            }
            else
            {
                Thread aThread = new Thread(() => SaveData());
                aThread.Name = "Saving Thread";
                aThread.Start();
            }
        }
    }
在方法中启动一个新线程是一个好的实践吗

那要看情况

如果您的应用程序使用的UI框架(如WinForms或WPF)依赖于一个保持未阻止状态的线程来处理UI事件,那么是的,请不要使用UI线程执行超过UI响应可接受延迟的任何操作。您可以通过异步/等待模式(最适合IO,如您的情况)或通过启动多个线程/任务来完成CPU密集型工作

在web服务/控制器中,启动新线程通常是不明智的。相反,使用异步/等待模式来执行IO密集型任务

如果您的工作是CPU密集型的(这里不是您的情况),无论应用程序类型如何,创建多个线程并在线程之间分割工作是一个好主意,以最大限度地利用多个CPU核心


与直接使用线程相比,如果您自己开始,使用任务可能更明智。请参见

创建新线程的成本很高,CPU一次只能处理每个核心的一个线程。最好让管理员为您管理线程

如果需要控制线程的创建方式(例如,如果需要前台线程或具有特定优先级的线程),则只应使用
new Thread()

在后台线程上执行CPU密集型操作的最简单方法是使用
Task.Run()
。内部。它将使用线程池

对于I/O操作,请使用异步版本的I/O方法。这样就不会阻塞等待I/O的线程


您可以
等待
任务以获得结果并捕获异常,而不阻塞主线程。

可能会回答您关于捕获的问题exceptions@DStanley:这仅适用于后台线程,请参阅