Мне нужно запустить 5 алгоритмов параллельно, каждый из которых берет изображение в качестве входного и выдает изображение в качестве выходного. После того, как все это будет сделано, мне нужно отобразить 5 выходных изображений. Я использую асинхронный обратный вызов с использованием делегатов для этой задачи.
Итак, я создал 5 делегатов для этих 5 алгоритмов и назвал их как algo1Delegate.BeginInvoke ().
Алгоритмы работают нормально и выдают результат тоже. У меня две проблемы с отображением этих изображений.
Для отображения изображений я создал класс ImageViewer (форма windows с элементом picturebox).
//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 () в качестве 3-го параметра
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);
}
Я думаю, вы можете увидеть проблему в приведенной выше функции обратного вызова. он работает только для Algo1 для других 4-х журналов, его необходимо преобразовать в Algo2Delegate, Algo3Delegate и т. д., поскольку asycResult.AsyncDelegate имеет тип object
. Как я могу решить эту проблему? Как я могу заставить это работать и для других?
Окно imageViewer перестает отвечать на запросы. Я не понимаю почему? ImageViewer
объект инициализируется и отображается в том же потоке для каждого из этих алгоритмов. Почему он перестает отвечать.
Есть ли другие альтернативные решения?
PS: я не могу объявить один тип делегата для всех алгоритмов, поскольку во входных параметрах есть некоторые различия.
EDIT:
Ну, у меня достаточно информации для первого и третьего вопросов. Я использовал отдельные обратные вызовы для каждого из этих алгоритмов. Моя вторая проблема до сих пор не решена. Я изменил конструктор 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()
. Я не понимаю, в чем проблема. Может ли кто-нибудь, пожалуйста, обратиться к этому тоже? Я также не получаю никаких исключений. Просто окно перестает отвечать на запросы. Я проверил, вызывают ли алгоритмы какие-либо проблемы. Но нет, они не.