C# 处理Windows 8.1应用程序中的长异步操作和频繁事件

C# 处理Windows 8.1应用程序中的长异步操作和频繁事件,c#,event-handling,async-await,C#,Event Handling,Async Await,考虑以下几点: void event_handler(object sender, ...){ DoSomething(); } void DoSomething(){ // change some page's state // change some page's private members var someData = await LongOperation(); // change some page's state

考虑以下几点:

  void event_handler(object sender, ...){
     DoSomething();
  }

  void DoSomething(){
     // change some page's state 
     // change some page's private members
     var someData = await LongOperation();
     // change some page's state 
     // change some page's private members
  }
现在,我想要以下行为:如果在前一个LongOperation()尚未完成时触发事件处理程序,则必须取消这样一个LongOperation()


最简单和首选的方法是什么?

最好通过
取消令牌来处理取消:

private CancellationTokenSource _cts;
async void event_handler()
{
  if (_cts != null)
    _cts.Cancel();
  _cts = new CancellationTokenSource();
  await DoSomethingAsync();
}

async Task DoSomethingAsync()
{
  // change some page's state 
  // change some page's private members
  var someData = await LongOperationAsync(_cts.Token);
  // change some page's state 
  // change some page's private members
}

有多种优化,例如,如果以前的操作未取消,则重用以前的
CancellationTokenSource
,等等。但此代码说明了一般原则。

取消最好通过
CancellationToken
处理:

private CancellationTokenSource _cts;
async void event_handler()
{
  if (_cts != null)
    _cts.Cancel();
  _cts = new CancellationTokenSource();
  await DoSomethingAsync();
}

async Task DoSomethingAsync()
{
  // change some page's state 
  // change some page's private members
  var someData = await LongOperationAsync(_cts.Token);
  // change some page's state 
  // change some page's private members
}

有多种优化,例如,如果以前的操作未取消,则重用以前的
CancellationTokenSource
,等等。但此代码说明了一般原则。

取消最好通过
CancellationToken
处理:

private CancellationTokenSource _cts;
async void event_handler()
{
  if (_cts != null)
    _cts.Cancel();
  _cts = new CancellationTokenSource();
  await DoSomethingAsync();
}

async Task DoSomethingAsync()
{
  // change some page's state 
  // change some page's private members
  var someData = await LongOperationAsync(_cts.Token);
  // change some page's state 
  // change some page's private members
}

有多种优化,例如,如果以前的操作未取消,则重用以前的
CancellationTokenSource
,等等。但此代码说明了一般原则。

取消最好通过
CancellationToken
处理:

private CancellationTokenSource _cts;
async void event_handler()
{
  if (_cts != null)
    _cts.Cancel();
  _cts = new CancellationTokenSource();
  await DoSomethingAsync();
}

async Task DoSomethingAsync()
{
  // change some page's state 
  // change some page's private members
  var someData = await LongOperationAsync(_cts.Token);
  // change some page's state 
  // change some page's private members
}
有多种优化,例如,如果先前的操作未被取消,则重用先前的
CancellationTokenSource
,等等。但此代码说明了一般原则