Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 迭代内异步返回-任务在ForEach内继续_C#_.net_Asynchronous_Task Parallel Library_Reactive Programming - Fatal编程技术网

C# 迭代内异步返回-任务在ForEach内继续

C# 迭代内异步返回-任务在ForEach内继续,c#,.net,asynchronous,task-parallel-library,reactive-programming,C#,.net,Asynchronous,Task Parallel Library,Reactive Programming,其目的是使用一组关键字搜索特定的内容,但要以反应方式进行搜索,而不是等待函数直接返回内容 下面的代码考虑了keywords参数中最多3个关键字项,但我需要循环搜索关键字,直到搜索完所有关键字,除非之前返回了肯定结果: public void SearchForSomething(params string[] keywords) { var index = -1; index = index + 1; if (keywords != null && key

其目的是使用一组关键字搜索特定的内容,但要以反应方式进行搜索,而不是等待函数直接返回内容

下面的代码考虑了keywords参数中最多3个关键字项,但我需要循环搜索关键字,直到搜索完所有关键字,除非之前返回了肯定结果:

public void SearchForSomething(params string[] keywords)
{
    var index = -1;
    index = index + 1;
    if (keywords != null && keywords.Any())
    {
        var successTask = this.Search(keywords[index]);
        successTask.ContinueWith(
            task =>
            {
                if (!task.Result)
                {
                    index = index + 1;
                    if (index < keywords.Count())
                    {
                        var successTask2 = this.Search(keywords[index]);
                        successTask2.ContinueWith(
                            task2 =>
                            {
                                if (!task2.Result)
                                {
                                    index = index + 1;
                                    if (index < keywords.Count())
                                    {
                                        var successTask3 = this.Search(keywords[index]);
                                        successTask3.ContinueWith(
                                            task3 =>
                                            {
                                                if (!task3.Result)
                                                {
                                                    this.NotifyNada(keywords);
                                                }
                                            });
                                    }
                                    else
                                    {
                                        this.NotifyNada(keywords);
                                    }
                                }
                            });
                    }
                    else
                    {
                        this.NotifyNada(keywords);
                    }
                }
            });
    }
    else
    {
        this.NotifyNada(keywords);
    }
}
如何搜索50个关键字字符串

异步,但仍按顺序,而不是并行
我提到过,您可能可以使用async/await提出一个简单的解决方案。我没有详细研究代码,但在我看来,这就是您正在做的:

public async Task SearchForSomething(params string[] keywords)
{
    foreach (var keyword in keywords)
    {
        if (await Search(keyword))
        {
            // If we have a result, we return
            return;
        }
    }
    // If we didn't find, notify?
    NotifyNada(keywords);
}

你到底想做什么?@Fabjan反应式编程,而不是使用同步返回结果和每个关键字上的块的搜索函数。你在使用.NET 4.5吗?乍一看,使用async/await看起来很简单。循环遍历每个关键字,等待搜索结果,如果结果为false,则中断并调用NotifyNada。@CharlesMager这可能很简单,但我看不到它-您能用代码提供答案吗请主动编程与异步执行搜索无关这是一个很好的点,可以稍微更改代码以匹配OP,这似乎是一个奇怪的方法:@flindeberg谢谢-我又读了一遍,你的编辑似乎是正确的!最初的目的是在调用第一个Searchkeyword后异步运行所有内容,并且没有任何返回类型,但是在调用线程上运行foreach循环和NotifyNada的负担应该是最小的,因此这非常有效。谢谢这仍然是异步的。记住任务!=线程-。如果涉及到多个线程,并且该线程正在UI线程上运行,并且您不希望在捕获的UI线程上下文上恢复后续搜索,则可以使用Search.configureWaitFalse。