在方法

时间:2015-10-13 17:31:18

标签: c# multithreading

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

public class AHelperClass
    {
        public void Stop()
        {                
            if (IsDataSaved)
            {
                DeleteData();
            }
            else
            {
                Thread aThread = new Thread(() => SaveData());
                aThread.Name = "Saving Thread";
                aThread.Start();
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

  

在方法

中启动新线程是一种好习惯

这取决于。

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

在Web服务/控制器中,启动新线程通常是不明智的。而是使用async / await模式执行IO密集型任务。

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

不是直接使用Threads,如果你自己开始使用,那么使用Tasks可能更明智。见Task vs Thread differences

答案 1 :(得分:0)

创建新线程非常昂贵,并且CPU一次只能处理每个核心一个线程。让ThreadPool为您管理线程更好。

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

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

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

您可以await任务获取结果并捕获异常而不会阻止主线程。