gpt4 book ai didi

c# - WPF 中排队事件的最佳实践

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:00 25 4
gpt4 key购买 nike

我有一个 WPF (MVVM) 项目,其中有多个 View 模型,每个 View 模型都有一个按钮,用于对同一数据源启动不同的分析,在本例中是一个文件。该文件无法共享,因此如果几乎同时按下按钮,则第二次调用将失败。

我需要一种方法来对按钮点击进行排队,以便每个分析都可以按顺序运行,但我似乎无法让它工作。我尝试使用静态 SemaphoreSemaphoreSlimMutex,但它们似乎停止了一切(Wait()函数似乎阻止了当前正在运行的分析)。我尝试了一个带有静态对象的 lock() 命令,但它似乎没有阻止任何一个事件(我收到文件共享错误)。我还尝试了一个线程池(最大并发线程数为 1),但它会在更新 UI 时出现线程错误(这可以通过 Invoke() 调用解决)。

我的问题是在这种情况下 WPF 的最佳实践是什么?

编辑:我创建了一个模型来展示我遇到的问题。它位于 http://1drv.ms/1s4oQ1T .

最佳答案

您在这里需要的是一个异步 队列,这样您就可以将这些任务排入队列,而实际上不会有任何东西阻塞您的线程。 SemaphoreSlim 实际上有一个 WaitAsync 方法,可以让创建这样一个队列变得相当简单:

public class TaskQueue
{
private SemaphoreSlim semaphore;
public TaskQueue()
{
semaphore = new SemaphoreSlim(1);
}

public async Task<T> Enqueue<T>(Func<Task<T>> taskGenerator)
{
await semaphore.WaitAsync();
try
{
return await taskGenerator();
}
finally
{
semaphore.Release();
}
}
public async Task Enqueue(Func<Task> taskGenerator)
{
await semaphore.WaitAsync();
try
{
await taskGenerator();
}
finally
{
semaphore.Release();
}
}
}

这允许您将所有顺序执行的操作加入队列,而不是并行执行,并且在任何时候都不会阻塞任何线程。这些操作也可以是任何类型的异步操作,无论是另一个线程中的 CPU 绑定(bind)工作、IO 绑定(bind)工作等。

关于c# - WPF 中排队事件的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26165517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com