Ошибка C# ListViewItem и Task

Код функционировал хорошо, когда он не использовал Task, сейчас меня бросает эта ошибка.

introducir la descripción de la imagen aquí

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

namespace RPOS.Controladores
{
    class Productos
    {
        RPOS.Modelos.Productos modelo_productos;
        principal form_principal;
        ListViewItem items_productos;
        string[,] productos;
        string[] producto;
        int total_filas_array = 0;
        string nombre_producto, codigo_producto, precio1, precio2, precio3, precio4, precio5, bodega, stock, detalle, codigo_barras, proveedor, categoria;
        int respuesta_modelo;
        string sql;
        DialogResult resultado_mensajes;
        MySqlCommand comando;
        BackgroundWorker cargar_productos;
        Funciones funciones;
        Paginacion paginacion;
        int[] paginacion_result;
        public Productos()
        {

            modelo_productos = new RPOS.Modelos.Productos();
            form_principal = new principal();
            cargar_productos = new BackgroundWorker();
            funciones = new Funciones();
            paginacion = new Paginacion();
            paginacion_result = new int[2];
           // cargar_productos.DoWork += new DoWorkEventHandler(hilo_mostarproductos);
        } 




        public async Task mostrar_productos(int opcion,string dato)
        {
            Datos.principal.lista_productos.Items.Clear();
            await Task.Run(() =>
            {

            //Limpiamos el Listview de Productos

         //   total_filas_array = modelo_productos.obtener_productos(opcion, dato).Length/14;
                   productos = modelo_productos.obtener_productos(opcion, dato);



                    for (int a = 0; a < 5; a++)
                    {
                    items_productos = new ListViewItem(productos[a, 1]);
                    items_productos.SubItems.Add(productos[a, 2]);
                    items_productos.SubItems.Add(productos[a, 8]);
                    items_productos.SubItems.Add(productos[a, 9]);
                    items_productos.SubItems.Add(productos[a, 10]);

                    Datos.principal.lista_productos.Items.Add(items_productos);

                    }


                productos = null;


            });

        }

        public void mostrar_producto(string codigo)
        {

            producto = modelo_productos.obtener_producto(codigo);

            Datos.principal.nombre_producto.Text = producto[1];
            Datos.principal.codigo_producto.Text = producto[2];
            Datos.principal.precio1_producto.Text = producto[3];
            Datos.principal.precio2_producto.Text = producto[4];
            Datos.principal.precio3_producto.Text = producto[5];
            Datos.principal.precio4_producto.Text = producto[6];
            Datos.principal.precio5_producto.Text = producto[7];
            Datos.principal.bodega_producto.Text = producto[8];
            Datos.principal.stock_producto.Text = producto[9];
            Datos.principal.detalle_producto.Text = producto[10];
            Datos.principal.categoria_producto.Text = producto[12];
            Datos.principal.proveedor_producto.Text = producto[13];
            Datos.principal.codigo_barras.Text = producto[14];




        }






        //En el pre_registro realizamos todo tipo de validaciones 
        public string pre_registro_producto()
        {
            nombre_producto = Datos.principal.nombre_producto.Text;
            codigo_producto = Datos.principal.codigo_producto.Text;
            precio1 = Datos.principal.precio1_producto.Text;
            precio2 = Datos.principal.precio2_producto.Text;
            precio3 = Datos.principal.precio3_producto.Text;
            precio4 = Datos.principal.precio4_producto.Text;
            precio5 = Datos.principal.precio5_producto.Text;
            bodega = Datos.principal.bodega_producto.Text;
            stock = Datos.principal.stock_producto.Text;
            detalle = Datos.principal.detalle_producto.Text;
            codigo_barras = Datos.principal.codigo_barras.Text;
            proveedor = Datos.principal.proveedor_producto.Text;
            categoria = Datos.principal.categoria_producto.Text;


            if (nombre_producto == "" || codigo_producto == "")
            {
                MessageBox.Show("Llene todos los campos con asterisco.","Informacion",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            else if(bodega == "" || categoria == "")
            {
                resultado_mensajes = MessageBox.Show("Si ingresa la BODEGA o CATEGORIA del producto no podra venderlo el mismo.Desea registrarlo igualmente ?", "Informacion", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);

                if(resultado_mensajes==DialogResult.Yes)
                {
                    registrar_producto();
                }


            }
            else if (precio1 == "" || precio2 == "" || precio3 == "" || precio4 == "" || precio5 == "")
            {

                resultado_mensajes = MessageBox.Show("Si no ingresa ningun PRECIO no podra venderlo el producto.Desea registrarlo igualmente ?", "Informacion", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);

                if (resultado_mensajes == DialogResult.Yes)
                {
                    registrar_producto();
                }


            }
            else if(Datos.principal.stock_producto.Text=="" || int.Parse(Datos.principal.stock_producto.Text)<1)
            {

                resultado_mensajes = MessageBox.Show("Si ingresa stock CERO no podra vender el producto.Desea registrarlo igualmente ?", "Informacion", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);

                if (resultado_mensajes == DialogResult.Yes)
                {
                    registrar_producto();
                }


            }
            else 
            {
                respuesta_modelo=modelo_productos.registrar_productos(nombre_producto,codigo_producto,precio1,precio2,precio3,precio4,precio5,bodega,stock,detalle, codigo_barras,proveedor,categoria);

                if (respuesta_modelo==1) 
                {
                    MessageBox.Show("Producto registrado correctamente.", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
                else
                {
                    MessageBox.Show("Error al registrar el producto.", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Error);

                }

            }

            return "";
        }
        //Enviamos los datos de registro al modelo
        public void registrar_producto()
        {
            respuesta_modelo = modelo_productos.registrar_productos(nombre_producto, codigo_producto, precio1, precio2, precio3, precio4, precio5, bodega, stock, detalle, codigo_barras, proveedor, categoria);

            if (respuesta_modelo == 1)
            {
                MessageBox.Show("Producto registrado correctamente.", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
            else
            {
                MessageBox.Show("Error al registrar el producto.", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }
        public void inhabilitar_producto(string codigo)
        {
            modelo_productos.inhabilitar_producto(codigo);
        }
        public void habilitar_producto(string codigo)
        {
            modelo_productos.habilitar_producto(codigo);
        }
    }
}
0
задан 22.12.2019, 02:42
1 ответ

Редактирование:

Поведение, что я описываю в моем начальном ответе, случилось со мной в app MVC, когда он посылал запрос ajax post/get в метод asincromo. Когда запрос прибывал в сервер, метод asГ-ncrono работал в новости sesiГіn. В volverrlo sГ-ncrono (снимая async Task) запрос hacГ - в в той же самой sesiГіn. Я подумал, что выставленная проблема была сходной, но проверяя снова проблему я понимаю, что это не случай. Эта проблема происходит в WindowsForm (по крайней мере оно кажется этим)

Тем не менее, в изображении наблюдается, что случается NullPointerException в первой lГ-nea for и к левой стороне в нижней части он может видеть стоимость переменной "в", который estГЎ в 48. Приходят к заключению о том, что for сделал 47 повторений правильно и произвел ошибку, введя 48. NullException в этой в линию только может проистекать того, что продукты [48,1] он недействительный. Сейчас вопрос, - потому что оно функционирует, когда он не имеет async/await? Мне кажется, что он, потому что он скроллирует с нею versiГіn cГіdigo, который ты поместил в ней explicaciГіn твоей проблемы. Если ты они видишь одинокий for, он до 5. Если только ты не подтвердил, что без async/await внизу тот же контекст не производит ошибку. Который правда не создала из-за представленной очевидности.

, Чтобы это решать, deberГ-схвати делать foreach

       foreach p in productos ) }
           items_productos = new ListViewItem(p[1]);
               items_productos.SubItems.Add(p[2]);
           items_productos.SubItems.Add(p[8]);
           items_productos.SubItems.Add(p[9]);
           items_productos.SubItems.Add(p[10]);
           Datos.principal.lista_productos.Items.Add(items_productos);


     }
-1
ответ дан 22.12.2019, 22:45