gpt4 book ai didi

dart - 防止并发访问 Dart 中的相同数据

转载 作者:IT王子 更新时间:2023-10-29 07:20:52 27 4
gpt4 key购买 nike

我正在尝试在 Dart (Flutter) 中创建一个文件缓存,其中一个文件只被下载一次,然后缓存以供将来请求使用。 (是的,我知道有现成的软件包,但我的需求更具体。)

问题是,如果我在同一页面上有两个小部件试图显示相同的图像,它们会同时发出相同的请求,下载文件两次。

我尝试将缓存变成单例,分发其自身的单个实例,但这似乎没有效果:

class FileCache {
final _fileList = List<File>();
static FileCache _instance;

factory FileCache() {
if (_instance == null) {
_instance = FileCache._internal();
}
return _instance;
}

FileCache._internal();

bool add(File file) {
if (_fileList.contains(file)) {
return false;
}
_fileList.add(file);
return true;
}

void remove(File file) {
_fileList.remove(file);
}
}

我确实看到了另一个执行同步的包(here),但是查看 Dart 代码我不知道它是如何强制执行同步访问的。

在 Dart 中,您如何才能为此目的强制串行访问特定的类或成员变量?

最佳答案

Flutter UI 在单个隔离中运行。内存不在 isolate 之间共享(因此得名),因此您无需担心并行 操作(就像您在多核系统上处理多个线程一样)。但是,您确实需要担心当执行从 await 中产生时可以交错的并发操作。

这意味着您不需要特殊的原子原语。您可以在下载文件时设置一个标志,以避免再次下载。

您不会在任何地方使用 Future,因此您的代码(如图所示)没有地方会被中断。但是,您也没有在实际下载文件的位置显示代码,并且大概您在那里有异步。你可以这样做:

final pendingDownloads = <String, Future<void>>{};
Future<void> downloadFile(String url) {
if (pendingDownloads.containsKey(url)) {
return pendingDownloads[url];
}

Future<void> downloadFileInternal() async {
final request = await HttpClient().getUrl(...);
...
}

pendingDownloads[url] = downloadFileInternal();
return pendingDownloads[url];
}

关于dart - 防止并发访问 Dart 中的相同数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55699545/

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