我有一个如下定义的类,Stop()函数只想查看数据是否保存。如果它被保存,则删除数据,否则,它会启动一个新线程来保存数据(因为数据可能非常大,需要花费很多时间来保存)。我想知道开始这样的新线程是否是一个好习惯。如果线程中发生异常,我该如何处理?如果保存需要很长时间,如果用户关闭应用程序会发生什么?对我来说这似乎不是一个好习惯,但我不知道我是否正确。如果它不好,有什么可能是更好的方法呢?谢谢!
public class AHelperClass
{
public void Stop()
{
if (IsDataSaved)
{
DeleteData();
}
else
{
Thread aThread = new Thread(() => SaveData());
aThread.Name = "Saving Thread";
aThread.Start();
}
}
}
答案 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
任务获取结果并捕获异常而不会阻止主线程。