【发布时间】:2021-05-07 01:39:01
【问题描述】:
C# Windows UWP 项目
我在调用另一个方法的异步方法中实现了 CancellationTokenSource 和 CancellationToken。此方法包含一个 while 循环,该循环将 bool 变量的值保持为 true,直到令牌源被取消。
异步方法由鼠标左键按下事件触发,并由使用 ColorPicker 控件时发生的鼠标左键释放事件取消。 bool 变量在 true 时允许将颜色值发送到设备,在 false 时阻止发送。
通过将该值保持为 true,只要鼠标按钮保持按下状态,设备就会在指针围绕颜色选择器移动时连续接收不同的颜色值。释放鼠标按钮后,生成的错误值(由将颜色值发送到设备的例程设置)阻止进一步的颜色消息发送到设备。
我的代码也按照我的意愿行事,但我担心如果我没有正确实现它可能会产生潜在的副作用。我在这个论坛上看到至少一个帖子表明顺序:cancel、dispose 和 set to null 可用于 CancellationTokenSource。但令我担心的是,我有一个可能无穷无尽的 while 循环,它完全取决于接收取消令牌。所以我的问题是过早处理 CancellationTokenSource 是否会阻止 token.IsCanellationRequested 设置为 true,如果是这样,添加延迟是否会增加任何好处?
以下是我的代码中相关的sn-ps:
全局变量:
public static bool colorPickerPtrPressed = false;
static CancellationTokenSource cts = null;
static CancellationToken token;
鼠标按钮事件:
private void ColorPicker_PtrPressedEvent(object sender, PointerRoutedEventArgs e)
{
if(cts == null) cts = new CancellationTokenSource();
token = cts.Token;
var picker = sender as ColorPicker.ColorPicker;
colorPickerPtrPressed = true;
(picker.DataContext as SpheroViewModel).Color = picker.SelectedColor.Color;
ColorChange(token);
}
private void ColorPicker_PtrReleasedEvent(object sender, PointerRoutedEventArgs e)
{
if (cts != null)
{
cts.Cancel();
Task.Delay(500).Wait(); // Allow some time for cancel to take effect
cts.Dispose();
cts = null;
}
}
取消令牌方法:
public static async Task ColorChange(CancellationToken token)
{
await Task.Run(() =>
AllowColorChange(token), token);
}
public static void AllowColorChange(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
colorPickerPtrPressed = true; // Maintain value as true
Task.Delay(100).Wait(); // allow color updates periodically
}
return;
}
【问题讨论】:
标签: c# uwp async-await cancellationtokensource cancellation-token