如何使用任务延迟运行非静态方法

How to use Task to run not static method with delay

我想知道如何使用任务来实现目标:使用参数启动方法(方法不是静态的)延迟 2 秒,但用户可以在任务开始前取消该任务。

我提供了来自移动应用程序的示例代码,方法在哪里:

这是我的例子:

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;
    }
}

你可以做类似的事情。

首先在你的class(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)
 {

 }

我同意您应该使用 Task.DelayCancellationToken 的其他答案。但是,我建议您使用 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;
}