从调度程序继续 foreach 循环
continue foreach loop from dispatcher
我有一个 foreach 循环,我在其中使用了调度程序,并且在其中还有另一个 foreach。想看结果先继续foreach
bool isNude = false;
var SearchTask = Task.Run(async () =>
{
foreach (var file in await GetFileListAsync(GlobalData.Config.DataPath))
{
isNude = false;
if (!ct.IsCancellationRequested)
{
await Dispatcher.InvokeAsync(() =>
{
if (ButtonNude.IsChecked == true)
{
foreach (var itemx in nudeData)
{
if (itemx.Equals(Path.GetFileNameWithoutExtension(file.FullName)))
{
isNude = true;
break;
}
}
}
if (isNude)
continue;
}, DispatcherPriority.Background);
}
}
}, ct);
但是无法继续,我该怎么做?
正如我在评论中提到的,Dispatcher.InvokeAsync
的 lambda 不知道它在循环中被调用,因此没有 continue
可用。您需要使用 return
退出等待的任务,这样您的代码才能在等待的任务之后继续。
bool isNude = false;
var SearchTask = Task.Run(async () =>
{
foreach (var file in await GetFileListAsync(GlobalData.Config.DataPath))
{
isNude = false;
if (!ct.IsCancellationRequested)
{
await Dispatcher.InvokeAsync(() =>
{
if (ButtonNude.IsChecked == true)
{
foreach (var itemx in nudeData)
{
if (itemx.Equals(Path.GetFileNameWithoutExtension(file.FullName)))
{
isNude = true;
break;
}
}
}
if (isNude)
return; // continue -> return
// other code
}, DispatcherPriority.Background);
// <--- code continues here after return
}
}
}, ct);
我有一个 foreach 循环,我在其中使用了调度程序,并且在其中还有另一个 foreach。想看结果先继续foreach
bool isNude = false;
var SearchTask = Task.Run(async () =>
{
foreach (var file in await GetFileListAsync(GlobalData.Config.DataPath))
{
isNude = false;
if (!ct.IsCancellationRequested)
{
await Dispatcher.InvokeAsync(() =>
{
if (ButtonNude.IsChecked == true)
{
foreach (var itemx in nudeData)
{
if (itemx.Equals(Path.GetFileNameWithoutExtension(file.FullName)))
{
isNude = true;
break;
}
}
}
if (isNude)
continue;
}, DispatcherPriority.Background);
}
}
}, ct);
但是无法继续,我该怎么做?
正如我在评论中提到的,Dispatcher.InvokeAsync
的 lambda 不知道它在循环中被调用,因此没有 continue
可用。您需要使用 return
退出等待的任务,这样您的代码才能在等待的任务之后继续。
bool isNude = false;
var SearchTask = Task.Run(async () =>
{
foreach (var file in await GetFileListAsync(GlobalData.Config.DataPath))
{
isNude = false;
if (!ct.IsCancellationRequested)
{
await Dispatcher.InvokeAsync(() =>
{
if (ButtonNude.IsChecked == true)
{
foreach (var itemx in nudeData)
{
if (itemx.Equals(Path.GetFileNameWithoutExtension(file.FullName)))
{
isNude = true;
break;
}
}
}
if (isNude)
return; // continue -> return
// other code
}, DispatcherPriority.Background);
// <--- code continues here after return
}
}
}, ct);