Ir ao conteúdo
  • Cadastre-se

C# Tornar execução de um método Assíncrono em C#


Posts recomendados

Boa Tarde.

Fiz o seguinte código em C# usando o Visual Studio e Windows Forms. O código desenha linhas usando o algoritmo de Bresenham, sendo que o algoritmo está funcionando perfeitamente em relação ao desenho das linhas. O problema é que ele desenha uma linha de cada vez (desenha uma depois outra), e eu preciso que ele consiga desenhar as linhas simultaneamente, sei que isso é resolvido usando Threads, porém não consegui fazer funcionar.

 

Ao executar o código do jeito que está abaixo, tenho o seguinte erro: " System.InvalidOperationException: 'Operação entre threads inválida: controle 'pictureBox1' acessado de um thread que não é aquele no qual foi criado.' ". Para "funcionar" de forma síncrona descomente a linha 118 e comente as linhas 119 e 120, porém preciso que ele funcione de forma assíncrona.

 

Obrigado.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PrimitivasGraficas
{
    public partial class Form1 : Form
    {
        int cDraw;
        int p1X;
        int p1Y;
        int p2X;
        int p2Y;

        Graphics g;

        public Form1()
        {
            InitializeComponent();

            g = pictureBox1.CreateGraphics();
            cDraw = 0;
            p1X = 0; p1Y = 0;
            p2X = 0; p2Y = 0;
        }

        public void drawPoint(int x, int y) // desenha um ponto 
        {
            Graphics g2 = Graphics.FromHwnd(pictureBox1.Handle);
            SolidBrush brush = new SolidBrush(Color.Blue);
            Point dPoint = new Point(x, y);

            dPoint.X = dPoint.X;
            dPoint.Y = dPoint.Y;

            Rectangle rect = new Rectangle(dPoint, new Size(5, 5));

            g2.FillRectangle(brush, rect);
            g2.Dispose() ;// */

        } // end

        public void bresenham(int x0, int y0, int x1, int y1) // desenha retas
        {
            int sx = 0;
            int sy = 0;
            int e2 = 0;
            int err = 0;

            int dx = Math.Abs(x1 - x0);
            int dy = Math.Abs(y1 - y0);

            if (x0 < x1) { sx = 1; } else { sx = -1; }
            if (y0 < y1) { sy = 1; } else { sy = -1; }

            if (dx > dy) { err = dx / 2; } else { err = -dy / 2; }

            for ( ; ; )
            {
                drawPoint(x0, y0); // desenha o proximo ponto
                System.Threading.Thread.Sleep(15); // ms

                if (x0 == x1 && y0 == y1) { break; } // para de desenhar

                e2 = err;

                if (e2 > -dx)
                {
                    err -= dy;
                    x0 += sx;
                }

                if (e2 < dy)
                {
                    err += dx;
                    y0 += sy;
                }

            } // end for

        } // end

        private void pictureBox1_MouseUp_1(object sender, MouseEventArgs e)
        {
            //pictureBox1.Refresh();
            this.Cursor = new Cursor(Cursor.Current.Handle);

            if (cDraw == 0) // ponto 1
            {
                lbX.Text = e.X.ToString();
                lbY.Text = e.Y.ToString();

                p1X = e.X;
                p1Y = e.Y;

                drawPoint(p1X, p1Y); // desenha o primeiro ponto

                cDraw = 1;
            }
            else

            if (cDraw == 1) // ponto 2
            {
                lbX.Text = e.X.ToString();
                lbY.Text = e.Y.ToString();

                p2X = e.X;
                p2Y = e.Y;

                drawPoint(p2X, p2Y); // desenha o segundo ponto
                //bresenham(p1X, p1Y, p2X, p2Y);
                Thread t = new Thread(()=> bresenham(p1X, p1Y, p2X, p2Y));
                t.Start();

                cDraw = 0;
            }
        }

    }

}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...