Использовать MouseUp !!
private void button6_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
MessageBox.Show("LEFT");
}
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
MessageBox.Show("RIGHT");
}
}
Когда вы выполняете метод async
, он начинает работать синхронно до тех пор, пока он не достигнет оператора await
, а остальная часть кода будет выполняться асинхронно, а выполнение вернется к вызывающему.
В вашем код callCount()
запускается синхронно с await task
, затем возвращается к Main()
методу, и поскольку вы не дожидаетесь завершения метода, программа заканчивается без метода count()
.
Вы можете увидеть желаемое поведение, изменив тип возвращаемого значения на Task
и вызывая Wait()
в методе Main()
.
static void Main(string[] args)
{
callCount().Wait();
}
static void count()
{
for (int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(2000);
Console.WriteLine("count loop: " + i);
}
}
static async Task callCount()
{
Task task = new Task(count);
task.Start();
for (int i = 0; i < 3; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine("Writing from callCount loop: " + i);
}
Console.WriteLine("just before await");
await task;
Console.WriteLine("callCount completed");
}
EDIT: Так выполняется ваш код:
(для лучшего понимания изменения типа CallCount()
возвращаются к Task
)
Main()
. CallCount()
. Count()
. await task;
. Это когда роль асинхронного ожидания играет свою роль. await
не похож на Wait()
, он не блокирует текущий поток до тех пор, пока задача не завершится, но вернет управление исполнением в метод Main()
и все остальные инструкции в CallCount()
(в данном случае только Console.WriteLine("callCount completed");
) будет исполнена после завершения задачи. Main()
вызов CallCount()
возвращает Task
(с оставшимися инструкциями CallCount()
и исходной задачей), и выполнение продолжается . Main()
продолжит завершение работы программы и уничтожаемых задач. Wait()
(если CallCount()
недействительно, чтобы вы не ожидали выполнения задачи), вы позволяете завершить задачу, удерживая ее в Main()
для выполнения Count()
и печатаемой «callCount». Если вы хотите дождаться окончания задания счетчика в CallCount()
, не возвращаясь к методу Main()
, вызовите task.Wait();
, вся программа будет ждать Count()
, но это не то, что await
будет делать.
Эта ссылка подробно описывает шаблон асинхронного ожидания.
H opes, эта диаграмма рабочего процесса вашего кода помогает вам.