[英]How to use Task to run not static method with delay
我不知道如何使用Tasks来实现目标:带有参数(方法不是静态的)的start方法具有2秒的延迟,但是用户可以在Task启动之前将其取消。
我提供了来自移动应用程序的示例代码,其中涉及方法:
这是我的示例:
private void DoWork(string abc)
{
MyItem.Text = abc;
}
public bool OnTouch(MotionEvent e)
{
switch (e.Action)
{
case MotionEvent.Down:
// start task with 2 seconds delay
break;
case MotionEvent.Move:
// cancel task
break;
case MotionEvent.Up:
// cancel task
break;
}
}
我同意您应该使用Task.Delay
和CancellationToken
其他答案。 但是,我建议您使用await
而不是ContinueWith
:
private void DoWork(string abc)
{
MyItem.Text = abc;
}
private async Task DoWorkWithDelayAsync(string abc, CancellationToken token)
{
try
{
await Task.Delay(TimeSpan.FromSeconds(2), token);
}
catch (OperationCanceledException)
{
// TODO: add a notification that the task did *not* run.
}
DoWork(abc);
}
private CancellationTokenSource cts;
public bool OnTouch(MotionEvent e)
{
switch (e.Action)
{
case MotionEvent.Down:
cts = new CancellationTokenSource();
var _ = DoWorkWithDelayAsync("", cts.Token);
break;
case MotionEvent.Move:
case MotionEvent.Up:
if (cts != null)
cts.Cancel();
break;
}
return true;
}
您可以做类似的事情。
首先在您的类(cancelToken)中添加CancellationTokenSource
属性并对其进行初始化
var cancelToken = new CancellationTokenSource();
然后
switch (e.Action)
{
case MotionEvent.Down:
Task.Delay(2000, cancelToken.Token).ContinueWith(() => DoSomething(),TaskScheduler.FromCurrentSynchronizationContext());
break;
case MotionEvent.Move:
cancelToken.Cancel(false);
break;
case MotionEvent.Up:
cancelToken.Cancel(false);
break;
}
在DoSomething函数中,用
if(!cancelToken.IsCancellationRequested)
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.