Судя по вашим комментариям, вы хотите иметь возможность начать ожидание нажатия внешней кнопки USB или нажатия клавиши отмены на клавиатуре.
Один из способов подойти к этому -инкапсулируйте ожидание кнопки USB или отмену в классе, например, так:
public sealed class UsbButtonWaiter
{
public UsbButtonWaiter(CancellationToken cancellation)
{
_cancellation = cancellation;
}
public async Task<bool> WaitForUsbButtonAsync()
{
var waitForUsbButton = Task.Run(this.waitForUsbButton);
var waitForCancellation = new Task(() => throw new InvalidOperationException(), _cancellation);
return await Task.WhenAny(waitForUsbButton, waitForCancellation) == waitForUsbButton;
}
void waitForUsbButton() // No idea how your code works for this, so here's a simulation.
{
Thread.Sleep(30000); // Simulate it taking 30s for the USB button to be pressed.
}
readonly CancellationToken _cancellation;
}
Затем вы можете использовать токен отмены для отмены ожидания нажатия кнопки USB.
В качестве примера того, какчтобы использовать это в форме, здесь я создал форму с одной кнопкой с именем button1
(по умолчанию при добавлении новой кнопки в форму).
Когда вы нажимаете эту кнопку, код будетначните ждать нажатия кнопки USB или, когда пользователь нажмет клавишу A
на клавиатуре.Вы можете проверить этот код, создав приложение Windows Forms по умолчанию и поместив кнопку по умолчанию в основную форму (которая будет называться Form1
по умолчанию).
Затем добавьте следующий код в Form1
:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (_cancellation == null)
return;
if (e.KeyCode == Keys.A)
_cancellation.Cancel();
}
async void button1_Click(object sender, EventArgs e)
{
if (_cancellation != null) // Already waiting?
return;
button1.Enabled = false;
button1.Text = "Waiting...";
_cancellation = new CancellationTokenSource();
UsbButtonWaiter waiter = new UsbButtonWaiter(_cancellation.Token);
bool wasUsbButtonPressed = await waiter.WaitForUsbButtonAsync();
if (wasUsbButtonPressed)
MessageBox.Show("USB button was pressed");
else
MessageBox.Show("Cancel key was pressed");
button1.Enabled = true;
button1.Text = "button1";
}
CancellationTokenSource _cancellation;
}
Если вы запустите это приложение и нажмете button1
, его текст изменится на Waiting...
и отключится.
Тогда ничего не произойдет, пока вы не нажмете A
или 30 с, после чего появится окно сообщения, сообщающее, была ли нажата кнопка USB или пользователь отменен, и кнопка будет повторно включена.
(Обратите внимание, что, конечно, кнопка USBникогда не нажимается, поскольку это всего лишь симуляция, но вы можете заменить соответствующий код.)