如何使用任务延迟运行非静态方法
How to use Task to run not static method with delay
我想知道如何使用任务来实现目标:使用参数启动方法(方法不是静态的)延迟 2 秒,但用户可以在任务开始前取消该任务。
我提供了来自移动应用程序的示例代码,方法在哪里:
- 如果未取消任务,正在执行 'something' 的 DoWork。
- OnTouch 正在侦听用户在设备屏幕上的触摸。当用户第一次触摸屏幕时 MotionEvent.Down 只出现一次,然后如果他在 2 秒内移动他的取景器(do MotionEvent.Move)或拉动他的取景器(do 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;
}
}
你可以做类似的事情。
首先在你的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.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;
}
我想知道如何使用任务来实现目标:使用参数启动方法(方法不是静态的)延迟 2 秒,但用户可以在任务开始前取消该任务。
我提供了来自移动应用程序的示例代码,方法在哪里:
- 如果未取消任务,正在执行 'something' 的 DoWork。
- OnTouch 正在侦听用户在设备屏幕上的触摸。当用户第一次触摸屏幕时 MotionEvent.Down 只出现一次,然后如果他在 2 秒内移动他的取景器(do MotionEvent.Move)或拉动他的取景器(do 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;
}
}
你可以做类似的事情。
首先在你的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.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;
}