访问主 UI 线程的最佳/最安全方法是什么?

发布于 2024-12-05 11:43:29 字数 963 浏览 0 评论 0原文

我想知道从另一个线程访问主 UI 线程的最佳/最安全的方法是什么。

我应该使用 Dispatcher.BeginInvoke 吗?

_cancelationTokenSource = new CancellationTokenSource();
        new Task(() =>
            {
                Dispatcher.BeginInvoke((Action)(() =>
                {
                    //process data
                }));
            }, _cancelationTokenSource.Token, TaskCreationOptions.LongRunning).Start();

或者我应该使用Dispatcher.Invoke?

    _cancelationTokenSource = new CancellationTokenSource();
        new Task(() =>
            {
                Dispatcher.Invoke((Action)(() =>
                {
                    //process data
                }));
            }, _cancelationTokenSource.Token, TaskCreationOptions.LongRunning).Start();

2 个 Invoke 方法之间的主要区别是什么?

使用 BeginInvokeInvoke 会对性能产生什么影响?

最重要的是,我希望我的 UI 保持响应能力。

I would like to know, what is the best/safest way to access the main UI thread from another thread.

Should i use Dispatcher.BeginInvoke?

_cancelationTokenSource = new CancellationTokenSource();
        new Task(() =>
            {
                Dispatcher.BeginInvoke((Action)(() =>
                {
                    //process data
                }));
            }, _cancelationTokenSource.Token, TaskCreationOptions.LongRunning).Start();

or should i use Dispatcher.Invoke?

    _cancelationTokenSource = new CancellationTokenSource();
        new Task(() =>
            {
                Dispatcher.Invoke((Action)(() =>
                {
                    //process data
                }));
            }, _cancelationTokenSource.Token, TaskCreationOptions.LongRunning).Start();

What is the main difference between the 2 Invoke methods?

What will the performance impact be when using BeginInvoke and Invoke?

Most important, i would like to keep my UI responsive.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无名指的心愿 2024-12-12 11:43:29

如果您想将其称为同步,请调用 Invoke() ;如果您想将其称为异步,请调用 BeginInvoke() 。如果您使用 BeginInvoke,则需要传递要在操作完成时调用的委托。

您已经处于后台线程中,因此无论哪种方式,UI 都将保持响应。仅取决于您是否希望该线程的执行等待操作完成,或者您是否希望在该线程继续执行的同时在后台完成操作。

Invoke() if you want to call it synchronous and BeginInvoke() for async .. if you use BeginInvoke you will need to pass the delegate to be called when the operation is finished.

You are already on a background thread so UI will remain responsive either way. Just depends on whether you want this thread's execution to wait for the operation to finish or if you want it done in the background while this thread's execution continues.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文