c# - 在 .Net Core 的另一个线程上调用函数
问题描述
我有一个长时间运行的任务的后台线程。
后台线程根据给定的过滤器搜索文件。该任务可能运行很长时间,所以我不想等待任务完成才能显示一些结果。
此外,我不想锁定我的 UI 线程以检查后台任务是否有新结果。
我宁愿通知我的主线程:“嘿,添加了一个新的搜索结果”。
有点像 Windows 资源管理器,在搜索仍在进行时显示搜索结果:
foreach (FileInfo itemToFilter in unfilteredSearchResults)
{
if (extension == ".wav" || extension == ".flac" || extension == ".mp3")
{
// read audio information such as tags etc. Might take some time per file
WaveFileLib.WaveFile.WAVEFile audioItem = new WaveFileLib.WaveFile.WAVEFile(audioFile.FullName);
// Compare audio information such as tags, title, license, date, length etc to filter
if (Filter.AudioItemMatchesFilter(ref audioItem))
{
lock (threadLock)
{
// add search result to list of filtered audio files
this.AudioItemList.Add(audioItem);
}
// notify main thread in order to refresh ui (if applicable)
ParentView.AudioItemAdded();
}
}
}
然后主线程可以从新添加的项目生成视图。
以前,这很容易,BeginInvoke
但使用 .net 核心,这种可能性似乎消失了。
我有哪些替代/选项来通知主线程有关更新的搜索结果?
解决方案
正如 Panagiotis Kanavos 所说
public class AudioFileSearcher
{
// task caller
public AudioFileSearcher(string searchPath, bool includeSubFolders, Views.SoundListView.SoundList parentView)
{
this.progress1 = new Progress<int>(
{
backgroundWorker1_ProgressChanged();
});
Task.Run(async () => await FindAudioFiles(progress1));
}
// reference to be updated by task and read by event Handler
private Progress<int> progress1 { get; set; }
// do something on task progress
void backgroundWorker1_ProgressChanged()
{
// Update UI on main thread or whatever
}
// Task
public async Task FindAudioFiles(IProgress<int> progress)
{
foreach(AudioItem itemToProcess in allFoundaudioItems)
{
// do long processing in background task
// a new element has been generated, update UI
if (progress != null) progress.Report(0); // ~fire event
}
}
}
推荐阅读
- javascript - 以灵活的高度同步滚动导航和内容
- powerbi - Power BI Azure Maps Visual 动态参考层?
- wordpress - WordPress - 如何在循环中将变量与 Timber (TWIG) 连接起来
- nginx - 如何使用女服务员为烧瓶应用程序正确配置 NGNIX for SSL
- java - 如何在android webview中启用后退按钮
- arrays - 似乎无法让我的刽子手游戏在 C 中运行?
- javascript - 通过另一个数组元素过滤一个对象数组
- c# - 将未指定的类从包加载到列表 C#
- c# - 如何在代码中添加材料设计:提示到文本框
- npm - npm probleme 启动项目