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

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

是否有可能等待事件而不是另一個(gè)異步方法?

是否有可能等待事件而不是另一個(gè)異步方法?

九州編程 2019-07-29 17:14:45
是否有可能等待事件而不是另一個(gè)異步方法?在我的C#/ XAML metro應(yīng)用程序中,有一個(gè)啟動(dòng)長(zhǎng)時(shí)間運(yùn)行過(guò)程的按鈕。所以,按照建議,我使用async / await來(lái)確保UI線程不被阻止:private async void Button_Click_1(object sender, RoutedEventArgs e) {      await GetResults();}private async Task GetResults(){       // Do lot of complex stuff that takes a long time      // (e.g. contact some web services)   ...}偶爾,GetResults內(nèi)發(fā)生的事情需要額外的用戶輸入才能繼續(xù)。為簡(jiǎn)單起見(jiàn),假設(shè)用戶只需單擊“繼續(xù)”按鈕即可。我的問(wèn)題是:如何以等待點(diǎn)擊另一個(gè)按鈕等事件的方式暫停GetResults的執(zhí)行?這是實(shí)現(xiàn)我正在尋找的東西的一種丑陋方式:“繼續(xù)”按鈕的事件處理程序設(shè)置了一個(gè)標(biāo)志......private bool _continue = false;private void buttonContinue_Click(object sender, RoutedEventArgs e){     _continue = true;}...和GetResults定期輪詢它: buttonContinue.Visibility = Visibility.Visible;  while (!_continue) await Task.Delay(100);  // poll _continue every 100ms  buttonContinue.Visibility = Visibility.Collapsed;民意調(diào)查顯然非常糟糕(忙碌的等待/浪費(fèi)周期),我正在尋找基于事件的東西。有任何想法嗎?順便說(shuō)一下,在這個(gè)簡(jiǎn)化的例子中,一個(gè)解決方案當(dāng)然是將GetResults()分成兩部分,從開(kāi)始按鈕調(diào)用第一部分,從繼續(xù)按鈕調(diào)用第二部分。實(shí)際上,GetResults中發(fā)生的事情更復(fù)雜,并且在執(zhí)行中的不同點(diǎn)可能需要不同類型的用戶輸入。因此,將邏輯分解為多種方法將是非常重要的。
查看完整描述

3 回答

?
溫溫醬

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

如果你有一件不尋常的事情await,那么最簡(jiǎn)單的答案往往是TaskCompletionSource(或者是一些async基于原始的原語(yǔ)TaskCompletionSource)。

在這種情況下,您的需求非常簡(jiǎn)單,因此您可以直接使用TaskCompletionSource

private TaskCompletionSource<object> continueClicked;private async void Button_Click_1(object sender, RoutedEventArgs e) {
  // Note: You probably want to disable this button while "in progress" so the
  //  user can't click it twice.
  await GetResults();
  // And re-enable the button here, possibly in a finally block.}private async Task GetResults(){ 
  // Do lot of complex stuff that takes a long time
  // (e.g. contact some web services)

  // Wait for the user to click Continue.
  continueClicked = new TaskCompletionSource<object>();
  buttonContinue.Visibility = Visibility.Visible;
  await continueClicked.Task;
  buttonContinue.Visibility = Visibility.Collapsed;

  // More work...}private void buttonContinue_Click(object sender, RoutedEventArgs e){
  if (continueClicked != null)
    continueClicked.TrySetResult(null);}

邏輯上,TaskCompletionSource就像一個(gè)async ManualResetEvent,除了你只能“設(shè)置”事件一次,事件可以有一個(gè)“結(jié)果”(在這種情況下,我們沒(méi)有使用它,所以我們只是設(shè)置結(jié)果null)。


查看完整回答
反對(duì) 回復(fù) 2019-07-29
?
慕虎7371278

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

這是我使用的實(shí)用程序類:


public class AsyncEventListener

{

    private readonly Func<bool> _predicate;


    public AsyncEventListener() : this(() => true)

    {


    }


    public AsyncEventListener(Func<bool> predicate)

    {

        _predicate = predicate;

        Successfully = new Task(() => { });

    }


    public void Listen(object sender, EventArgs eventArgs)

    {

        if (!Successfully.IsCompleted && _predicate.Invoke())

        {

            Successfully.RunSynchronously();

        }

    }


    public Task Successfully { get; }

}

以下是我如何使用它:


var itChanged = new AsyncEventListener();

someObject.PropertyChanged += itChanged.Listen;


// ... make it change ...


await itChanged.Successfully;

someObject.PropertyChanged -= itChanged.Listen;


查看完整回答
反對(duì) 回復(fù) 2019-07-29
  • 3 回答
  • 0 關(guān)注
  • 486 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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