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
,等等。但此代码说明了一般原则