繁体   English   中英

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

[英]How to use Task to run not static method with delay

我不知道如何使用Tasks来实现目标:带有参数(方法不是静态的)的start方法具有2秒的延迟,但是用户可以在Task启动之前将其取消。

我提供了来自移动应用程序的示例代码,其中涉及方法:

  • 如果未取消任务,则正在执行“某些操作”的DoWork。
  • 正在监听用户触摸设备屏幕上的OnTouch。 当用户第一次触摸屏幕时,MotionEvent.Down仅发生一次,然后,如果他将在2秒内移动查找器(执行MotionEvent.Move)或拉动查找器(执行MotionEvent.Up),则不会启动将运行DoWork的任务方法。

这是我的示例:

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

您可以做类似的事情。

首先在您的类(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM