今天除錯呼叫labview撰寫的dll,發現載入時間很長。決定將初次呼叫放入backgroundWorker控制元件中執行,同時在backgroundWorker的dowork最后一步寫了一個 button1.Enabled = true。除錯代碼居然報跨執行緒訪問。而運行exe不報錯,將那句代碼放入backgroundWorker的RunWorkerCompleted 中也不報錯,將求解答
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Enabled = false;
backgroundWorker1.RunWorkerAsync();
//backgroundWorker1.RunWorkerCompleted += BackgroundWorker1_RunWorkerCompleted;
}
//private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
//{
// button1.Enabled = true;
//}
private void button1_Click(object sender, EventArgs e)
{
Text = labview.ADD(30, 20.5).ToString();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
button1.Enabled = false;
labview.ADD(10, 20);
button1.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
class labview
{
[DllImport("SharedLib.dll", EntryPoint = "ADD", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] //每個匯出函式都要加上這一段
public static extern double ADD(double a, double b);
}
}
uj5u.com熱心網友回復:
跨執行緒呼叫,需要使用Invoke(同步)或者(異步)BeginInvokeuj5u.com熱心網友回復:
dowork這個里面的代碼是另外一個后臺執行緒執行的,不要去呼叫主執行緒的ui界面的東西,完成了就應該RunWorkerCompleted里去執行界面修改,這個是主執行緒執行的。執行exe沒報錯,要么自動優化了跨執行緒不報錯,也許自動加了CheckForIllegalCrossThreadCalls = true,不清楚機制,要么就干脆沒有編譯為異步。
uj5u.com熱心網友回復:
我把DoWork里面呼叫dll的代碼去掉,也不會報錯。
uj5u.com熱心網友回復:
查了下MSDN,DoWork下面有這句
uj5u.com熱心網友回復:
Invoke(new EventHandler(delegate
{
button1.Enabled = true;
}));
uj5u.com熱心網友回復:
一直以為DoWork是可以跨執行緒使用的
uj5u.com熱心網友回復:
可以在RunWorkerCompleted事件,把結果更新到UI,無需Invoke。
在ProgressChanged事件下,也無需Invoke。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/56935.html
標籤:C#
上一篇:智慧農業-物聯網
