2 回答
![?](http://img1.sycdn.imooc.com/54586870000183e302200220-100-100.jpg)
TA贡献1824条经验 获得超6个赞
对于浏览此内容的任何人:这是我想出的,基于 k1dev 的链接SemaphoreSlim(在此处阅读。
这实际上非常容易。根据问题中的代码,我添加了一个SemaphoreSlim并等待它(异步)。ASemaphoreSlim是一个轻量级的,Semaphore专门用于在 UI 线程上运行。我使用 aQueue<char>来确保以正确的顺序处理密钥:
SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
Queue<char> queue = new Queue<char>();
private async void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
queue.EnQueue(e.KeyChar);
await semaphore.WaitAsync();
try
{
await HandleKey(queue.DeQueue());
}
finally
{
semaphore.Release();
}
}
作为奖励:我有一个方法,如果应用程序很忙,我只想跳过它,可以使用以下代码完成:
if (await semaphore.WaitAsync(0)) //Note the zero as timeout
{
try
{
await MyMethod();
}
finally
{
semaphore.Release();
}
}
![?](http://img1.sycdn.imooc.com/54584cde0001d19202200220-100-100.jpg)
TA贡献1891条经验 获得超3个赞
首先,听起来这个问题还有更多内容,或者可能会有后续行动。
也就是说,您可以尝试使您的 HandleKey 同步以管理共享资源:
[MethodImpl(MethodImplOptions.Synchronized)]
async Task HandleKey(char ch)
{
试试这个线程以供参考: C# version of java's synchronized 关键字?
PS - 所以我想得越多,你就越像是在尝试同步执行某些工作单元,但将其从 ui 线程中卸载。也就是说,同步 HandleKey 方法不会达到预期的结果。我认为您可能正在寻找 Dispatcher 模式:
https://www.what-could-possively-go-wrong.com/the-dispatcher-pattern/
https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher(v=vs.110).aspx
- 2 回答
- 0 关注
- 193 浏览
添加回答
举报