繁体   English   中英

在C#dll中调用委托

[英]Calling a delegate in C# dll

我是第一次使用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必须是进行VOIP调用的SDK。 因此,准备编写UI的任何人都可以使用我们的SDK。

典型的(简化的)方案是:

  • 在应用程序启动时,UI调用DLL.Start()。 这将在DLL中创建一个线程,并确保DLL准备好进行和接收调用。

  • 用户拨打电话号码。

  • UI线程从DLL调用MakeCall()方法。

  • 在DLL中,有上下文切换到DLL线程以便启动新的调用。 启动调用的所有工作都在DLL线程中进行。

  • UI线程未被阻止或不等待。

  • 在某一点,呼叫建立。

  • DLL线程通过调用委托方法来通知UI。

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上下文上进行更新

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

您的应用程序只需要一个GUI线程和一个用于DLL上下文的附加线程。 不需要其他线程来同步它们。

似乎代码将在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
    }
}

您应该在C#中查找BackgroundWorker ,这是专门用来执行您想要的操作-在后台线程上执行某些操作,然后将结果传递回UI线程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM