using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
namespace project1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//MySql.Data.MySqlClient.MySqlConnection conn1;
string connStr = "server=128.0.0.1;user=root;database=mytest;port=3306;password=root;";
MySqlConnection conn = new MySqlConnection(connStr);
Task.Factory.StartNew(() =>
{
try
{
conn.Open();
MessageBox.Show("資料庫連接成功!");
//int current = 5;
//int vol = 6;
////int temp = 7;
//MySqlCommand cmd = new MySqlCommand("insert into user set current ='" + current + "'" + ",vol='" + vol + "'", conn);
string sql = "insert into analog(current,vol) values('2','83')";//寫入
//string sql = "update analog set current='0',vol='0' where id='1'";//更改
//string sql = "delete from analog where id='1'";//洗掉
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
// Perform database operations
}
catch (MySqlException ex) //(Exception ex)
{
MessageBox.Show("資料庫連接失敗!");
switch (ex.Number)
{
case 0:
//Console.WriteLine("Cannot connect to server. Contact administrator");
MessageBox.Show("Cannot connect to server. Contact administrator");
break;
case 1045:
//Console.WriteLine("Invalid username/password, please try again");
MessageBox.Show("Invalid username/password, please try again");
break;
}
}
conn.Close();
});
//try
//{
// //conn.Open();
// MessageBox.Show("資料庫連接成功!");
// //int current = 5;
// //int vol = 6;
// ////int temp = 7;
// //MySqlCommand cmd = new MySqlCommand("insert into user set current ='" + current + "'" + ",vol='" + vol + "'", conn);
// string sql = "insert into analog(current,vol) values('2','83')";//寫入
// //string sql = "update analog set current='0',vol='0' where id='1'";//更改
// //string sql = "delete from analog where id='1'";//洗掉
// MySqlCommand cmd = new MySqlCommand(sql, conn);
// cmd.ExecuteNonQuery();
// // Perform database operations
//}
//catch (MySqlException ex) //(Exception ex)
//{
// //MessageBox.Show("資料庫連接失敗!");
// switch (ex.Number)
// {
// case 0:
// //Console.WriteLine("Cannot connect to server. Contact administrator");
// MessageBox.Show("Cannot connect to server. Contact administrator");
// break;
// case 1045:
// //Console.WriteLine("Invalid username/password, please try again");
// MessageBox.Show("Invalid username/password, please try again");
// break;
// }
//}
//conn.Close();
}
private async void button2_Click(object sender, EventArgs e)
{
string connStr = "server=128.0.0.1;user=root;database=mytest;port=3306;password=root;";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
await conn.OpenAsync();
string sql = "select * from analog";
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader reader = cmd.ExecuteReader();//執行ExecuteReader()回傳一個MySqlDataReader物件
while (reader.Read())//初始索引是-1,執行讀取下一行資料,回傳值是bool
{
//Console.WriteLine(reader[0].ToString() + reader[1].ToString() + reader[2].ToString());
//Console.WriteLine(reader.GetInt32(0)+reader.GetString(1)+reader.GetString(2));
//Console.WriteLine(reader.GetInt32("userid") + reader.GetString("username") + reader.GetString("password"));//"userid"是資料庫對應的列名,推薦這種方式
textBox1.AppendText("id = " + reader.GetInt16("id") + "current = " + reader.GetInt16("current") + "vol = " + reader.GetInt16("vol") +"\r\n");
}
// Perform database operations
}
catch (MySqlException ex) //(Exception ex)
{
//MessageBox.Show("資料庫連接失敗!");
switch (ex.Number)
{
case 0:
//Console.WriteLine("Cannot connect to server. Contact administrator");
//MessageBox.Show("Cannot connect to server. Contact administrator");
break;
case 1045:
//Console.WriteLine("Invalid username/password, please try again");
//MessageBox.Show("Invalid username/password, please try again");
break;
}
}
conn.Close();
}
}
}
小弟初學c#和資料庫,除錯中刻意將資料庫地址由127.0.0.1改為128.0.0.1,導致本地資料庫無法打開,沒有使用異步方法時發現視窗假死。現采用2種方法,button1用的是Task,button2用的是asycn/await,實驗結果發現button2依然存在假死問題,不知道是什么原因。
uj5u.com熱心網友回復:
你可以在第一行寫await Task.Yield();讓后邊的代碼異步執行。
uj5u.com熱心網友回復:
試了下,好像沒有效果,感覺await conn.OpenAsync();這句好像沒有起作用uj5u.com熱心網友回復:
你說的“button2假死”是指你要去人工去等待 button2 執行完畢?async/await 方法的意思是主執行緒不用去等待 button2 執行完畢,不被阻塞。不是你說的這個目的。
uj5u.com熱心網友回復:
嗯,改一下,“是指你要去人工去等待 button2 原來的阻塞代碼部分執行完畢”你原來的 conn.OpenAsync 這類代碼不靠譜,那么就不要用了。你只要把寫
async Task xxxx()這樣的代碼,也不會去阻塞父執行緒了!已經讓后邊的同步阻塞代碼跑在子執行緒中了。
{
await Task.Yield();
Thread.Sleep(100000); //表示你的任何耗時的操作
}
既不需要 Task.Factory.StartNew 代碼,也不必須使用 conn.OpenAsync 這類代碼。
uj5u.com熱心網友回復:
感謝您的回答,我知道用其他方法也可以實作,我主要想知道程式中有沒有異步方法使用不正確的地方導致假死(點擊button2后視窗在一段時間內無法移動),網上也有人用過OpenAsync,沒搜到出現什么問題。uj5u.com熱心網友回復:
那你就把那個while 拿掉在看,不要糾結什么OpenAsync 。那不過就是一句話,你外面還有100句話需要檢查呢uj5u.com熱心網友回復:
另外MySqlConnection conn = new MySqlConnection(connStr);ok,我們問問你,OpenAsync 這又怎么寫的,不是什么方法名加個aysnc就叫異步,把這個方法貼出來看看
uj5u.com熱心網友回復:
我把地址改為127.0.0.1程式是可以運行的,資料庫里只有一條資料,并不會造成讀寫時間過長。因為我地址寫的是錯的寫的是128.0.0.1,除錯中程式并沒有執行到while,資料庫不會打開直接進入catch,其實就是想測驗一下異步執行是否有效。另外OpenAsync 是官方庫程式我看了下他定義在System.Data.Common空間下,并不是我寫的,具體方法內容是什么還真不知道。應該是和檔案打開一樣也有OpenAsync和Open。uj5u.com熱心網友回復:
全部的程式我都貼出來了,就這么多。只是個小測驗歷程。uj5u.com熱心網友回復:
這種問題就除錯下OpenAsync 函式 也許 會同步做一些事情說不定uj5u.com熱心網友回復:
不錯的問題。查了一下,mysql應該是根本沒有實作異步方法uj5u.com熱心網友回復:
您在哪看到的,能否發個鏈接,謝謝轉載請註明出處,本文鏈接:https://www.uj5u.com/net/12958.html
標籤:C#
上一篇:關于c#模型+Mysql+.net mvc的求助!!
下一篇:c#參考ocx控制元件
