use*_*984 2 c# variables multithreading
用户.我遇到了一个我无法找到答案的问题.我是Threading的新手(在C#中),遇到了这个问题.我有这个带有效果的图像编辑器,但由于它运行得太慢,我试图将其拆分为线程.问题是他总是使用效果列表中的最后一项运行"CreatePreview"命令.因此,如果我激活了效果:"黑/白","Sature"和"GreenFilter",它将尝试使用greenfilter创建3个预览.
任何人都可以帮我解决这个问题吗?
private void CreatePreviews(string fileName, List<IEffect> effects)
{
List<Task> tasks = new List<Task>();
foreach (var effect in effects)
{
//previews.Add(effect, CreatePreview(fileName, effect));
Task task = new Task(delegate()
{
string result = CreatePreview(fileName, effect);
Dispatcher.BeginInvoke(new Action(
delegate()
{
ShowPreview(result, effect.DisplayName);
}));
});
task.Start();
}
}
Run Code Online (Sandbox Code Playgroud)
我现在无法测试,但我很确定你的问题是你正在关闭循环变量.
获取一个循环变量的副本,然后将其关闭:
foreach (var effect in effects)
{
var effectCopy = effect;
//previews.Add(effectCopy, CreatePreview(fileName, effectCopy));
Task task = new Task(delegate()
{
string result = CreatePreview(fileName, effectCopy);
Dispatcher.BeginInvoke(new Action(delegate()
{
ShowPreview(result, effectCopy.DisplayName);
}));
});
task.Start();
}
Run Code Online (Sandbox Code Playgroud)
(或者等待C#5,它会在每次迭代时自动关闭变量的新副本.)