我希望寫要使用的插件.dll文件/通過在運行時調用.NET應用程序調用。我的.dll是一個WinForm,並顯示正在進行的(計算上很昂貴的)操作。從主應用程序調用的.dll通過.NET System.Reflection
調用。我必須向呼叫應用程序提供名稱空間,類和方法我想調用。
我想多線程我的.dll,以便它更友好,我只是真的很熟悉BackgroundWorker
s。
編輯:擴展到問題。
因此,我調用該.dll如下:
if (classType != null)
{
if (bDllIsWinForm)
{
classInst = Activator.CreateInstance(classType);
Form dllWinForm = (Form)classInst;
dllWinForm.Show();
// Invoke required method.
MethodInfo methodInfo = classType.GetMethod(strMethodName);
if (methodInfo != null)
{
object result = null;
// The method being called in this example is 'XmlExport'.
result = methodInfo.Invoke(classInst, new object[] { dllParams });
return result.ToString();
}
}
else
{
// Else not a WinForm do simalar.
}
}
所以後來在WinForm爲.dll我想多線程費力的工作,這樣我可以顯示正在發生的事情的時間。因此,在.dll文件,使用BackgroundWorker
我:
BackgroundWorker bgWorker; // Global.
public string XmlExport(object[] connectionString)
{
try
{
bgWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true };
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
// Wait until workerThread is done.
threadDoneEvent = new AutoResetEvent(false);
bgWorker.RunWorkerAsync();
threadDoneEvent.WaitOne();
return strResult; // Global String strResult
}
catch (Exception)
{
throw;
}
}
然後我有DoWork
事件處理程序:
void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker thisWorker = sender as BackgroundWorker;
strResult = (string)this.XmlExportBgw(ref thisWorker); // Or should I use bgWorker?
e.Result = strResult;
}
public string XmlExportThreaded(ref BackgroundWorker thisWorker)
{
try
{
// Some expesive work...
// UI.
InfoBall infoBall = new InfoBall(); // Class containing processing information.
// Set infoBall parameters here...
(thisWorker as BackgroundWorker).ReportProgress(infoBall.progressBarValue, infoBall);
// Some more expensive work...
// UI.
(thisWorker as BackgroundWorker).ReportProgress(infoBall.progressBarValue, infoBall);
}
//...
}
的`ProgressChanged」事件是
void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// UI.
InfoBall someBall = (InfoBall)e.UserState;
// Update process information.
if (someBall.showRichTextBox)
{
this.richTextBox.AppendText(someBall.richTextBoxText);
this.richTextBox.ScrollToCaret();
}
return;
}
除以上代碼我有通常的RunWorkerCompleted
等。
T他調用的應用程序已被編寫爲允許用戶在運行時調用.NET .dll。我試圖放在一起的.dll是一個時間密集型的,只會提供給特定用戶。我運行了上述代碼,問題是它不會正確更新用戶界面。那就是你不能操作(調整大小,點擊等)Form
,它不會打印和處理信息,直到處理結束時纔會打印多次最終的消息。但是,它正確地生成我需要的.xml文件。我究竟做錯了什麼?我應該從一個單獨的線程調用.dll方法嗎?
任何幫助將不勝感激。非常感謝你花時間陪伴。
刪除threadDoneEvent.WaitOne()調用。開始一個線程,然後等待它完全破壞了使用線程的原因。並阻止運行RunWorkerCompleted事件,這是您要用來處理線程結果的事件。 –
直到.dll完成其工作後,我纔不想傳回調用應用程序。通過這種方式,線程完成了工作,而顯示.dll所做工作的WinForm仍處於打開狀態。主要問題是我的.dll的用戶界面不能正確更新?非常感謝你花時間陪伴。 – MoonKnight
ProgessChanged事件也不會觸發。你不能等。 –