我第一次在C# DLL上工作。DLL方法将由C#应用程序调用。UI将在C#应用程序中。到目前为止,这是相当基本的。
但是DLL中的工作必须在属于DLL的线程中完成。DLL中的工作不能在UI线程上下文中执行。所以DLL方法调用将是异步的,这很好。
所以基本上我们的想法是:
UI线程应该如何向DLL线程发送消息?有什么简单的方法吗?
当DLL线程调用委托时会发生什么?委托代码是在DLL线程上下文中执行还是在UI线程上下文中执行?
看起来代码将在DLL线程上下文中执行。如果是这样的话,如何在UI线程上下文中执行委托代码?
谢谢你的帮助!
==================
编辑:只要应用程序是活动的,DDL线程就必须保持活动。DLL线程还将接收来自网络的事件,然后通知UI线程。
实际上,DLL需要是一个SDK来进行VOIP调用。因此,任何准备编写UI代码的人都可以使用我们的SDK。
一个典型的(简化)情景是:
发布于 2015-09-18 13:20:55
Task workerTask = Task.Factory.StartNew(() =>
{
// call your dll and do some long process
});
Task uiTask = workerTask.ContinueWith((x) =>
{
// update your ui (textBox.Text = x.Value;)
}, TaskScheduler.FromCurrentSynchronizationContext());TaskScheduler.FromCurrentSynchronizationContext -捕获当前( ui )同步上下文,因此更新将发生在ui上下文上。
发布于 2015-09-18 13:08:11
应用程序是否需要有两个线程,一个线程与DLL通信,另一个线程用于UI?
对于DLL上下文,应用程序只需要一个GUI线程和一个额外的线程。不需要更多的线程来同步它们。
看起来代码将在DLL线程上下文中执行。如果是这样的话,如何在UI线程上下文中执行委托代码?
如果您尝试从创建相应对象的GUI线程之外的另一个线程调用WinForm方法,那么您将得到一个InvalidOperationException,因为WinForms将检查这个例子。一种简单的方法是检查是否需要更改均衡器中的线程上下文,如下所示:
已处理的事件:
public event Action<string> OnCallWithString;埃文桑德勒:
void Form_OnCallWithString(string obj)
{
if (InvokeRequired) Invoke(new Action<string>(Form_OnCallWithString), obj);
else
{
//normal eventhandler logic here
}
}发布于 2015-09-18 13:06:36
您应该在BackgroundWorker中查找C#,这完全是为了做您想做的事情--在后台线程上执行一些内容,并将结果传回UI线程。
这比尝试在DLL中创建自己的线程和编组要好得多。让它只是一个函数库,让调用者担心它想要使用哪些线程。
https://stackoverflow.com/questions/32652390
复制相似问题