Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF线程问题更好的选择_Wpf_Multithreading - Fatal编程技术网

WPF线程问题更好的选择

WPF线程问题更好的选择,wpf,multithreading,Wpf,Multithreading,以下是我们尝试使用thread/dispatcher进行多任务处理时使用的两种方法: 我想知道是否有人有任何建议哪一个是更好的选择 片段1: Thread t = new Thread(new ThreadStart(delegate { MyMethod(); })); t.IsBackground = true; t.Start(); t.Join(); 片段2: Dispatcher.C

以下是我们尝试使用thread/dispatcher进行多任务处理时使用的两种方法: 我想知道是否有人有任何建议哪一个是更好的选择

片段1:

Thread t = new Thread(new ThreadStart(delegate
                {
                   MyMethod();
                }));
t.IsBackground = true;
t.Start();
t.Join();
片段2:

Dispatcher.CurrentDispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
           (dummyDelegate)delegate
           {
               MyMethod();

           }
    );
请告知。 谢谢 两者都不是“更好”:它们是不同的

第一个示例在后台线程上运行MyMethod。因此,如果MyMethod阻塞,例如在网络活动或执行计算密集型操作时,这不会阻塞UI线程,并且UI保持响应。(尽管由于示例代码阻塞并等待,您目前正在失去这一优势。)缺点是,如果MyMethod想要读取或更新UI,它必须跳过一些小障碍

第二个示例在UI线程上运行MyMethod。这允许MyMethod不受限制地与UI中的元素交互,但如果MyMethod需要很长时间,则不适合,因为它会在MyMethod运行时冻结UI

所以这取决于MyMethod的功能。如果MyMethod更新了几个UI元素,然后退出,请使用第二个选项。如果MyMethod加载文件或下载数据,和/或执行冗长的计算,请使用第一种方法。

两者都不是“更好”:它们是不同的

第一个示例在后台线程上运行MyMethod。因此,如果MyMethod阻塞,例如在网络活动或执行计算密集型操作时,这不会阻塞UI线程,并且UI保持响应。(尽管由于示例代码阻塞并等待,您目前正在失去这一优势。)缺点是,如果MyMethod想要读取或更新UI,它必须跳过一些小障碍

第二个示例在UI线程上运行MyMethod。这允许MyMethod不受限制地与UI中的元素交互,但如果MyMethod需要很长时间,则不适合,因为它会在MyMethod运行时冻结UI


所以这取决于MyMethod的功能。如果MyMethod更新了几个UI元素,然后退出,请使用第二个选项。如果MyMethod加载文件或下载数据,和/或执行冗长的计算,请使用第一个选项。

还有第三个选项:使用线程池执行短期异步调用。例如:

System.Threading.Threadpool.QueueUserWorkItem(
    delegate(object context)
    {
        // context is unused
        MyMethod();
    });

这将使用线程池中的线程来执行MyMethod。方法完成后,线程将返回池。此方法的优点是,您不必自己管理线程的生存期,也不会因创建和销毁线程而产生内存和性能开销。

还有第三种选择:使用线程池执行短期异步调用。例如:

System.Threading.Threadpool.QueueUserWorkItem(
    delegate(object context)
    {
        // context is unused
        MyMethod();
    });

这将使用线程池中的线程来执行MyMethod。方法完成后,线程将返回池。这种方法的优点是,您不必自己管理线程的生命周期,也不会因为创建和销毁线程而产生内存和性能开销。

使用好的ole有什么问题吗


它不是WinForms专用的,所以您仍然可以在WPF中使用它。

使用好的ole有什么问题吗


它不是WinForms专用的,因此您仍然可以在WPF中使用它。

也许原始海报打算在代码段2中使用this.Dispatcher.Invoke在该对象所属的UI线程上运行代码?使用Dispatcher.CurrentDispatcher只是在同一个线程上同步执行代码。也许原始海报打算在代码段2中使用this.Dispatcher.Invoke在该对象所属的UI线程上运行代码?使用Dispatcher.CurrentDispatcher只是在同一线程上同步执行代码。