c# - C# 的多线程和并发

标签 c# multithreading concurrency asynchronous

在 Windows 窗体窗口中,多个事件可以触发一个异步方法。此方法下载文件并将其缓存。我的问题是我希望该方法执行一次。换句话说,我想防止文件被多次下载。

如果下载文件的方法被触发两次,我希望第二次调用等待文件(或等待第一个方法完成)。

有人知道如何实现吗?

更新:我只是想防止不必要的下载。在我的例子中,当客户端将鼠标放在 ListBox 中的项目上超过几毫秒时,我们开始下载。我们假设用户将单击并请求该文件。可能发生的情况是,用户将鼠标悬停在项目上一秒钟,然后单击。在这种情况下,将开始两次下载。我正在寻找处理这种情况的最佳方法。

更新 2::用户可能会将鼠标移到多个项目上。结果,将发生多次下载。我对这种情况并不是很严格,但现在如果我们遇到这种情况,我们不会放弃下载。文件将被下载(文件通常约为 50-100kb),然后将被缓存。

最佳答案

维护表单变量中正在发生的事情的状态,并让您的异步方法在执行任何操作之前检查该状态。不过,请确保同步访问它!互斥量和信号量很适合这种事情。

如果您可以同时下载不同的文件,则需要在列表中跟踪正在下载的内容以供引用。

如果一次只能下载一个文件,并且您不想排队,您可以在下载某些内容时取消 Hook 事件,并在下载完成时重新 Hook 。

关于c# - C# 的多线程和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/444739/

相关文章:

C# 将 Excel 工作表保存为 html 并读取此 html

C# 碰撞编程 - Momentum

python - LED闪烁如何打发时间。 sleep RPI

c++ - CPU 松弛指令和 C++11 原语

iphone - 在 iOS 中进行异步调用同步的最佳实践?

java - 使用 FutureTask 比 Callable 有什么优势?

c# - CS0117 - Xamarin 未检测到 'Resources' 文件夹和文件

c# - C# 中的 PKCS5Padding

Java线程连接()

MySQL 多个事务递增同一行