这部分是按键/焦点问题和任务/睡眠问题我提供了一些示例代码来展示我的工作。确切的计算略有不同,需要更多的资源。此代码不起作用,因为在循环中没有键被捕获。我可以让它工作的唯一方法是在循环中放置一个MessageBox。我怎样才能做到这一点?我在考虑睡觉或做事,但我无法让它发挥作用。
CancellationTokenSource cts;
public async Task<bool> Execute()
{
globalKeyboardHook gkh = new globalKeyboardHook();
gkh.HookedKeys.Add(Keys.Escape);
gkh.KeyUp += new KeyEventHandler(gkh_KeyUp);
cts = new CancellationTokenSource();
try
{
bool reponses = await DoLongLoopingTask(someData,cts.Token);
return true;
}
catch (OperationCanceledException)
{
MessageBox.Show("Stop By User"); }
catch (Exception)
{
MessageBox.Show("Internal Error");
}
cts=null;
return true;
}
void gkh_KeyUp(object sender, KeyEventArgs e)
{
MessageBox.Show("Escape Pressed");
if (cts != null)
{
cts.Cancel();
}
}
async Task<bool> DoLongLoopingTask(List<Object> someData, CancellationToken ct)
{
int resultCuml=0;
foreach (Object data in someData)
{
ct.ThrowIfCancellationRequested();
resultCuml+=data*11;
}
return resultCuml>1012824;
}
我真正想要的是在后台运行时可以中断的部分代码。任务可能会或可能不是一个好的解决方案,如果其他更好的东西,我愿意改变它。