首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C# dll中调用委托

在C# dll中调用委托
EN

Stack Overflow用户
提问于 2015-09-18 12:45:40
回答 3查看 1.3K关注 0票数 0

我第一次在C# DLL上工作。DLL方法将由C#应用程序调用。UI将在C#应用程序中。到目前为止,这是相当基本的。

但是DLL中的工作必须在属于DLL的线程中完成。DLL中的工作不能在UI线程上下文中执行。所以DLL方法调用将是异步的,这很好。

所以基本上我们的想法是:

  • 应用程序在其项目中包括DLL。
  • DLL定义各种委托。
  • 应用程序“订阅”这些委托。
  • UI线程调用DLL方法。
  • DLL接收方法调用。
  • 有一个上下文切换到DLL线程(实际执行与方法调用相关联的工作)。
  • UI线程继续其执行。UI线程不会被阻塞,也不会等待。
  • DLL线程执行一些工作。
  • DLL线程调用委托将结果通知UI线程。

UI线程应该如何向DLL线程发送消息?有什么简单的方法吗?

当DLL线程调用委托时会发生什么?委托代码是在DLL线程上下文中执行还是在UI线程上下文中执行?

看起来代码将在DLL线程上下文中执行。如果是这样的话,如何在UI线程上下文中执行委托代码?

谢谢你的帮助!

==================

编辑:只要应用程序是活动的,DDL线程就必须保持活动。DLL线程还将接收来自网络的事件,然后通知UI线程。

实际上,DLL需要是一个SDK来进行VOIP调用。因此,任何准备编写UI代码的人都可以使用我们的SDK。

一个典型的(简化)情景是:

  • 在应用程序启动时,UI调用DLL.Start()。这将在DLL中创建一个线程,并确保DLL已准备好进行和接收调用。
  • 用户拨一个电话号码。
  • UI线程从DLL调用MakeCall()方法。
  • 在DLL中,有上下文切换到DLL线程,以便启动新的调用。启动调用的所有工作都是在DLL线程中完成的。
  • UI线程不会被阻塞或等待。
  • 在某一时刻,呼叫被建立起来。
  • DLL线程通过调用委托方法通知UI。
EN

回答 3

Stack Overflow用户

发布于 2015-09-18 13:20:55

代码语言:javascript
复制
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上下文上。

票数 1
EN

Stack Overflow用户

发布于 2015-09-18 13:08:11

应用程序是否需要有两个线程,一个线程与DLL通信,另一个线程用于UI?

对于DLL上下文,应用程序只需要一个GUI线程和一个额外的线程。不需要更多的线程来同步它们。

看起来代码将在DLL线程上下文中执行。如果是这样的话,如何在UI线程上下文中执行委托代码?

如果您尝试从创建相应对象的GUI线程之外的另一个线程调用WinForm方法,那么您将得到一个InvalidOperationException,因为WinForms将检查这个例子。一种简单的方法是检查是否需要更改均衡器中的线程上下文,如下所示:

已处理的事件:

代码语言:javascript
复制
public event Action<string> OnCallWithString;

埃文桑德勒:

代码语言:javascript
复制
void Form_OnCallWithString(string obj)
{
    if (InvokeRequired) Invoke(new Action<string>(Form_OnCallWithString), obj);
    else
    { 
        //normal eventhandler logic here
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-09-18 13:06:36

您应该在BackgroundWorker中查找C#,这完全是为了做您想做的事情--在后台线程上执行一些内容,并将结果传回UI线程。

这比尝试在DLL中创建自己的线程和编组要好得多。让它只是一个函数库,让调用者担心它想要使用哪些线程。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32652390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档