【发布时间】:2012-05-21 23:18:27
【问题描述】:
用户。我遇到了一个我找不到答案的问题。我对线程(在 C# 中)有点陌生,遇到了这个问题。我有这个带效果的图像编辑器,但由于运行速度太慢,我尝试将其拆分为线程。问题是他总是使用效果列表中的最后一项来运行“CreatePreview”命令。因此,如果我激活效果:“黑/白”、“饱和”和“绿色滤镜”,它将尝试使用绿色滤镜创建 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();
}
}
【问题讨论】:
-
您可能还需要提供
CreatePreview和ShowPreview的代码,以便我们确定它们是否是适当的线程安全的。例如,如果您在CreatePreview中使用全局变量作为“当前效果”,则所有三个都将引用相同的效果,即最后一个任务设置的效果。 -
搜索“访问修改后的闭包”或“捕获的变量”,你会看到你的问题。例如:stackoverflow.com/questions/235455/access-to-modified-closure
-
谢谢^^。这似乎奏效了。
-
关闭此作为您的示例不再说明您的问题。将来,请在问题中保留“错误”代码,以便为修复它的答案提供上下文:)
标签: c# multithreading variables