【问题标题】:Run two methods parallel when page starts页面启动时并行运行两种方法
【发布时间】:2017-08-05 08:50:23
【问题描述】:

我有两个方法必须在页面启动时并行运行。

public Page1()
{ 
    InitializeComponent();
    loadtest();
    loadtest2();
}

这些方法从我的 MySQL 数据库中获取图像并将其存储在一个可以稍后调用的变量中。

public void loadtest()
{
    string query = "select*from question where id='" + 1 + "'";
    MySqlConnection conDataBase = new MySqlConnection(constring);
    MySqlCommand cmdDataBase = new MySqlCommand(query, conDataBase);
    MySqlDataReader myReader;

    try
    {
        conDataBase.Open();
        myReader = cmdDataBase.ExecuteReader();

        while (myReader.Read())
        {
            string qid = myReader.GetInt32("id").ToString();

            byte[] imgg1q1 = (byte[])(myReader["question"]);
            byte[] imgg2q1 = (byte[])(myReader["opt1"]);
            byte[] imgg3q1 = (byte[])(myReader["opt2"]);
            byte[] imgg4q1 = (byte[])(myReader["opt3"]);
            byte[] imgg5q1 = (byte[])(myReader["opt4"]);

            MemoryStream mstreamq1 = new MemoryStream(imgg1q1);
            MemoryStream mstream1q1 = new MemoryStream(imgg2q1);
            MemoryStream mstream2q1 = new MemoryStream(imgg3q1);
            MemoryStream mstream3q1 = new MemoryStream(imgg4q1);
            MemoryStream mstream4q1 = new MemoryStream(imgg5q1);

            q1.BeginInit();
            q1.StreamSource = mstreamq1;
            q1.CacheOption = BitmapCacheOption.OnLoad;
            q1.EndInit();

            q1opt1.BeginInit();
            q1opt1.StreamSource = mstream1q1;
            q1opt1.CacheOption = BitmapCacheOption.OnLoad;
            q1opt1.EndInit();

            q1opt2.BeginInit();
            q1opt2.StreamSource = mstream2q1;
            q1opt2.CacheOption = BitmapCacheOption.OnLoad;
            q1opt2.EndInit();

            q1opt3.BeginInit();
            q1opt3.StreamSource = mstream3q1;
            q1opt3.CacheOption = BitmapCacheOption.OnLoad;
            q1opt3.EndInit();

            // Assign the Source property of your image
            option_3.Source = q1opt3;

            q1opt4.BeginInit();
            q1opt4.StreamSource = mstream4q1;
            q1opt4.CacheOption = BitmapCacheOption.OnLoad;
            q1opt4.EndInit();
        }

        conDataBase.Close();
    }
    catch
    {
    }
}

public void loadtest2()
{
    string query = "select*from question where id='" + 2 + "'";
    MySqlConnection conDataBase = new MySqlConnection(constring);
    MySqlCommand cmdDataBase = new MySqlCommand(query, conDataBase);
    MySqlDataReader myReader;

    try
    {
        conDataBase.Open();
        myReader = cmdDataBase.ExecuteReader();

        while (myReader.Read())
        {
            string qid = myReader.GetInt32("id").ToString();

            byte[] imgg1 = (byte[])(myReader["question"]);
            byte[] imgg2 = (byte[])(myReader["opt1"]);
            byte[] imgg3 = (byte[])(myReader["opt2"]);
            byte[] imgg4 = (byte[])(myReader["opt3"]);
            byte[] imgg5 = (byte[])(myReader["opt4"]);

            MemoryStream mstream = new MemoryStream(imgg1);
            MemoryStream mstream1 = new MemoryStream(imgg2);
            MemoryStream mstream2 = new MemoryStream(imgg3);
            MemoryStream mstream3 = new MemoryStream(imgg4);
            MemoryStream mstream4 = new MemoryStream(imgg5);

            q2.BeginInit();
            q2.StreamSource = mstream;
            q2.CacheOption = BitmapCacheOption.OnLoad;
            q2.EndInit();

            q2opt1.BeginInit();
            q2opt1.StreamSource = mstream1;
            q2opt1.CacheOption = BitmapCacheOption.OnLoad;
            q2opt1.EndInit();

            q2opt2.BeginInit();
            q2opt2.StreamSource = mstream2;
            q2opt2.CacheOption = BitmapCacheOption.OnLoad;
            q2opt2.EndInit();

            q2opt3.BeginInit();
            q2opt3.StreamSource = mstream3;
            q2opt3.CacheOption = BitmapCacheOption.OnLoad;
            q2opt3.EndInit();

            q2opt4.BeginInit();
            q2opt4.StreamSource = mstream4;
            q2opt4.CacheOption = BitmapCacheOption.OnLoad;
            q2opt4.EndInit();
        }

        conDataBase.Close();
    }
    catch
    {
    }
}

我已经尝试过互联网上给出的方法,但是当我并行运行它们时它不会显示问题。我已经使用线程来运行方法,但变量变空并且不显示任何内容。 我也用过Parallel.Invoke(() => loadtest(),() =>loadtest2()); 但这也没用;它保存第一个函数的值,在上面的例子中是loadtest(),并且不保存第二个函数的值,即loadtest2()

【问题讨论】:

    标签: c# mysql wpf


    【解决方案1】:

    一种方式

    public Page1()
        { 
             InitializeComponent();
             var test1 = Task.Run(() => loadtest());
             var test2 = Task.Run(() => loadtest2());
             Task.WhenAll(test1,test2);
        }
    

    其他方式是

    public Page1()
    { 
         InitializeComponent();
         Parallel.Invoke(new Action(loadtest),new Action(loadtest2));
    }
    

    【讨论】:

    • 我尝试了这两种方法,但任务方法没有显示问题我不知道当我让它们显示时变量是空的。当我简单地编写它们时它们工作得很好......就像......loadtest(); loadtest2();......和下​​一个并行调用它在上面的情况下为第一个编写的方法保存图像它的 loadtest() 但对于 loadtest2 它再次变空
    • 尝试锁定可能会干扰代码。但我认为代码是并行运行的
    • 是的,我已经测试了该方法....代码并行运行,但它只是没有将值保存在变量中.....我如何锁定这些值...
    • 您的代码需要重构。其次只是尝试用不同的方法保存不同的位图,看看效果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2023-01-25
    • 2021-03-07
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多