第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Dispatcher.CurrentDispatcher 導(dǎo)致 ReactiveUI 調(diào)用掛起

Dispatcher.CurrentDispatcher 導(dǎo)致 ReactiveUI 調(diào)用掛起

C#
猛跑小豬 2022-10-15 14:26:32
在下面的示例中,調(diào)用.Execute()ReactiveCommand 會(huì)掛起或創(chuàng)建死鎖。為什么會(huì)發(fā)生這種情況,避免這種情況的最佳方法是什么?該錯(cuò)誤僅在調(diào)用 Dispatcher.CurrentDispatcher 時(shí)發(fā)生。不幸的是,不稱其為顯而易見的答案在更大的項(xiàng)目中不是一個(gè)選擇。我在項(xiàng)目中有nuget包reactiveui-core和reactiveui-winforms,都是v7.4.0。我正在使用 Resharper 從 Visual Studio 運(yùn)行 nunit 測(cè)試。該代碼是一個(gè) NUnit 測(cè)試夾具,注意 TimeoutAfterAsync 是一個(gè)幫助方法,用于在一定超時(shí)后取消測(cè)試,在沒有這個(gè)包裝器的情況下觀察到行為[TestFixture]public class ReactiveCommandTests{    private static async Task<bool> ExecuteCommand()    {        await Task.Delay(1000);        return true;    }    public static ReactiveCommand<Unit, bool> Command = ReactiveCommand.CreateFromTask(ExecuteCommand);    public static ReactiveCommand<Unit, bool> CommandOnTaskpoolScheduler = ReactiveCommand.CreateFromTask(ExecuteCommand, outputScheduler: RxApp.TaskpoolScheduler);    public static ReactiveCommand<Unit, bool> CommandAfterDispatcherInvoked = ReactiveCommand.CreateFromTask(ExecuteCommand);    [Test, Order(1)]    public async Task Test()    {        //THIS WORKS        try        {            await TimeoutAfterAsync(                Command.Execute(),                TimeSpan.FromSeconds(5),                "control");        }        catch (TimeoutException)        {            Assert.Fail("Control case timed out (not expected)");        }    }    [Test, Order(2)]    public async Task Test_CreateCommandAfterDispatcherCall()    {        //This line causes unwanted behaviour        var x = Dispatcher.CurrentDispatcher;        //THIS FAILS        try        {            await TimeoutAfterAsync(                CommandAfterDispatcherInvoked.Execute(),                TimeSpan.FromSeconds(5),                "after dispatcher creation");        }        catch (TimeoutException)        {            Assert.Fail("Executing commandAfterDispatcherInvoked timed out (expected, but not understood");        }    }
查看完整描述

1 回答

?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊

Dispatcher.CurrentDispatcher很有趣;如果當(dāng)前線程還沒有調(diào)度器,它會(huì)為當(dāng)前線程創(chuàng)建一個(gè)調(diào)度器!這會(huì)導(dǎo)致單元測(cè)試出現(xiàn)問題,因?yàn)樾碌恼{(diào)度程序是為線程池線程創(chuàng)建的,該線程不是 STA 并且沒有消息泵。

理想的解決方案是不調(diào)用CurrentDispatcher. 曾經(jīng)。使用awaitorIProgress<T>或(如果必須)SynchronizationContext將結(jié)果/進(jìn)度/事件傳達(dá)給 UI 線程。這些抽象更容易為其創(chuàng)建測(cè)試環(huán)境。

但就目前而言,您可能可以使用WpfContext,這是 Async CTP 早期版本中包含的一種舊實(shí)用程序類型。WpfContext.Run將接受一個(gè)委托,為當(dāng)前線程創(chuàng)建一個(gè)調(diào)度程序上下文,并在該調(diào)度程序上下文中執(zhí)行該委托,泵送其消息,直到異步操作完成。


查看完整回答
反對(duì) 回復(fù) 2022-10-15
  • 1 回答
  • 0 關(guān)注
  • 101 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)