首页 > 解决方案 > 在 .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 核心,这种可能性似乎消失了。

我有哪些替代/选项来通知主线程有关更新的搜索结果?

标签: c#multithreadinguser-interface.net-core

解决方案


正如 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
        }
    }
}

像魅力一样工作,正在加载物品 在此处输入图像描述


推荐阅读