【发布时间】:2010-12-22 18:38:29
【问题描述】:
我需要并行运行 5 个算法,每个算法都将图像作为输入并将图像作为输出。每一个都完成后,我需要显示 5 个输出图像。我正在为此任务使用委托的异步回调。
所以,我为这 5 个算法创建了 5 个委托,并像 algo1Delegate.BeginInvoke() 一样调用它们。
算法运行良好并且也给出了输出。我在显示这些图像时遇到了 2 个问题。
为了显示图像,我创建了一个类 ImageViewer(其中包含图片框元素的 Windows 窗体)。
//ImageViewer constructor
ImageViewer(Image img, String Title)
{
this.pictureBox1.Image = img;
this.Text = Title;
}
我正在显示这样的图像:
void showImage(Image image, String title)
{
ImageViewer imageviewer = new ImageViewer(image, title);
imageviewer.Show();
}
因为我需要在算法之后显示图像。我将 new AsyncCallback(showImage) 代表传递给每个 BeginInvoke() 作为第三个参数
private void showImage(IAsyncResult iasycResult)
{
MessageBox.Show("white" + Thread.CurrentThread.ManagedThreadId);
// Retrieve the `caller` delegate.
AsyncResult asycResult = (AsyncResult)iasycResult;
caller = (Algo1Delegate)asycResult.AsyncDelegate;//### PROBLEM!!!
// Retrieve the string Title that is passed in algodelegate.BeginInvoke().
string title = (string)iasycResult.AsyncState;
Image outputImage = caller.EndInvoke(iasycResult);
showImage(outputImage, title);
}
我想你可以在上面的回调函数中看到问题。它仅适用于其他 4 个 alog 的 Algo1,它需要转换为 Algo2Delegate 、 Algo3Delegate 等。因为 asycResult.AsyncDelegate 的类型为
object。我怎么解决这个问题?我怎样才能让它也适用于其他人?imageViewer 窗口变得“无响应”。我不明白为什么?
ImageViewer对象被初始化并显示在每个算法的同一线程上。为什么它变得没有响应。还有其他替代解决方案吗?
PS:我无法为所有算法声明一个 delegateType,因为输入参数存在一些差异。
编辑:
嗯,我的第 1 和第 3 问题的输入已经足够了。我对这些算法中的每一个都使用了单独的回调。我的第二个问题仍未解决。我更改了 ImageViewer() 的构造函数,只是为了检查它们是否在两个不同的线程上执行:
public ImageViewer(Image img, String title)
{
InitializeComponent();
if (pictureBox1.InvokeRequired) MessageBox.Show("You must Invoke()");
else MessageBox.Show("No need of Invoke()");
this.pictureBox1.Image = img;
this.Text = title + " : Image Viewer";
}
在每种情况下都显示No need of Invoke()。我不明白有什么问题。任何人都可以解决这个问题吗?我也没有任何例外。只是窗口变得没有反应。我检查了算法是否引起了任何麻烦。但不,它们不是。
【问题讨论】:
-
为什么需要 5 种不同类型的代表?难道你不能只创建一种可以用于所有 5 个任务的类型吗?
-
因为虽然算法对输入图像进行操作。不同的算法需要不同的编号。参数。
-
爪子,也许您可以将这些参数重新组合到一个类中,这将是单个委托的参数
-
是的,我认为但基于它们的功能,这些在逻辑上并不相同。每个算法都是图像处理和模式识别不同阶段的一个实例。
标签: c# .net winforms multithreading asynchronous