Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.Net Core中的另一个线程上调用函数_C#_Multithreading_User Interface_Search_.net Core - Fatal编程技术网

C# 在.Net Core中的另一个线程上调用函数

C# 在.Net Core中的另一个线程上调用函数,c#,multithreading,user-interface,search,.net-core,C#,Multithreading,User Interface,Search,.net Core,我有一个长时间运行任务的后台线程 后台线程根据给定的过滤器搜索文件。 任务可能会运行很长时间,因此我不想为了显示一些结果而等待任务完成 此外,我不想为了检查后台任务是否有新结果而锁定UI线程 我宁愿通知我的主线程:嘿,添加了一个新的搜索结果。 有点像windows资源管理器,在搜索仍在进行时显示搜索结果: 然后,主线程可以从新添加的项生成一个视图。 以前,使用BeginInvoke很容易做到这一点,但是使用.net内核,这种可能性似乎消失了 我可以选择哪些选项来通知主线程更新的搜索结果?正如P

我有一个长时间运行任务的后台线程

后台线程根据给定的过滤器搜索文件。 任务可能会运行很长时间,因此我不想为了显示一些结果而等待任务完成

此外,我不想为了检查后台任务是否有新结果而锁定UI线程

我宁愿通知我的主线程:嘿,添加了一个新的搜索结果。 有点像windows资源管理器,在搜索仍在进行时显示搜索结果:

然后,主线程可以从新添加的项生成一个视图。 以前,使用BeginInvoke很容易做到这一点,但是使用.net内核,这种可能性似乎消失了


我可以选择哪些选项来通知主线程更新的搜索结果?

正如Panagiotis Kanavos所设想的那样

公共类音频文件搜索器 { //任务调用者 公共音频文件搜索字符串搜索路径,bool includeSubFolders,Views.SoundListView.SoundList parentView { this.progress1=新进展 { 背景工作1_进度发生变化; }; Task.Runasync=>wait findaudiofiles progress1; } //由任务更新并由事件处理程序读取的引用 私有进程进程1{get;set;} //在任务进度上做点什么 无效后台工作1\u进度已更改 { //更新主线程上的UI或其他任何内容 } //任务 公共异步任务FindAudioFilesIProgress进度 { foreachAudioItem在allFoundaudioItems中处理 { //在后台任务中进行长时间处理 //已生成新元素,更新UI 如果进度!=null progress.Report0;//~fire事件 } } } 工作就像一个符咒,物品都装得满满的

您应该使用Microsoft的反应式框架,即Rx-NuGet System.Responsive,并使用System.Responsive.Linq;-然后你可以这样做:

IObservable<WaveFileLib.WaveFile.WAVEFile> query =
    from itemToFilter in unfilteredSearchResults.ToObservable()
    where extension == ".wav" || extension == ".flac" || extension == ".mp3"
    from audioItem in Observable.Start(() => new WaveFileLib.WaveFile.WAVEFile(audioFile.FullName))
    from x in Observable.Start(() =>
    {
        var a = audioItem;
        var flag = Filter.AudioItemMatchesFilter(ref a);
        return new { flag, audioItem = a };
    })
    where x.flag
    select x.audioItem;
    
IDisposable subscription =
    query
        .ObserveOnDispatcher()
        .Subscribe(audioItem =>
        {
            /* Your code to update the UI here */
        });
我不清楚它是在创建一个新的波形文件,还是调用AudioItemMatchesFilter需要花费时间,所以我将两者都包装在Observable.Start中。您也有一个ref调用,这使得代码有点混乱

尽管如此,此代码在后台处理所有调用,并在结果进入dispatcher线程时自动移动结果。

使用该类。它就是为了这个原因而创建的
IObservable<WaveFileLib.WaveFile.WAVEFile> query =
    from itemToFilter in unfilteredSearchResults.ToObservable()
    where extension == ".wav" || extension == ".flac" || extension == ".mp3"
    from audioItem in Observable.Start(() => new WaveFileLib.WaveFile.WAVEFile(audioFile.FullName))
    from x in Observable.Start(() =>
    {
        var a = audioItem;
        var flag = Filter.AudioItemMatchesFilter(ref a);
        return new { flag, audioItem = a };
    })
    where x.flag
    select x.audioItem;
    
IDisposable subscription =
    query
        .ObserveOnDispatcher()
        .Subscribe(audioItem =>
        {
            /* Your code to update the UI here */
        });