Tag: 回调

C#:如何通过以某种方式从另一个线程发出信号来强制从主线程“调用”一个方法

对不起长标题,我甚至不知道如何表达问题的方式 我正在使用一个库,它从主线程(是一个C库)的不同上下文运行回调,我在C#中创建了回调,当我被调用时,我想提出一个事件。 但是因为我不知道事件内部会是什么,我想找到一种方法来调用方法而不会出现锁等问题(否则第三方用户将不得不在事件中处理这个问题,非常难看) 有没有办法做到这一点? 我可以完全错误的方式,但我正在考虑winforms方式来处理不同的线程(.Invoke的事情) 否则我可以发送消息到窗口的消息循环,但我不知道很多关于消息传递,如果我可以发送像这样的“自定义”消息 例: private uint lgLcdOnConfigureCB(int connection, System.IntPtr pContext) { OnConfigure(EventArgs.Empty); return 0U; } 这个回调是从另一个我无法控制的程序调用的,我想在主线程中运行OnConfigure方法(处理我的winform的那个),怎么做呢? 换句话说,我想运行OnConfigure而不需要考虑锁 编辑1: 我有这个例外的问题: CallbackOnCollectedDelegate reived消息:在GarbageCollector中收集的委托’G19dotNet!G19dotNet.LgLcd + lgLcdOnSoftButtonsCB :: Invoke’上运行回调。 在非托管代码期间,应确保代理永远不会被删除,直到您确定它们永远不会被调用 编辑2: 问题由我自己解决,感谢Stackoverflow总是帮助我! 供将来参考: 将委托定义为函数指针

“运行时检查失败#0 – 从C ++代码成功进行C#回调后,ESP的值未在函数调用中正确保存”

我正在制作一个使用GameSpy C代码的C#应用​​程序(GP部分)。 C代码成功地调用了一个回调(它是C#代码),但是我得到了这个错误Run-Time Check Failure #0 – The value of ESP was not properly saved across a function call在回调完成后Run-Time Check Failure #0 – The value of ESP was not properly saved across a function call 。 我用C代码制作了一个DLL,如下所示: // GPCallback ///////////// __declspec(dllexport) typedef void (* GPCallback)( GPConnection * connection, void * arg, void * param ); […]

使用回调从Inno Setup调用C#DLL

我有一个正在运行的Inno Setup脚本,其中我使用Sherlock Software的innocallback.dll。 这个DLL包装了我的一个过程,以便它可以传递给C#DLL。 我不想使用这个DLL,我想直接调用我导出的C#方法并将回调过程传递给它。 我的问题是: 如何将我的Inno安装程序( @mycallback )传递给我的C#DLL,以便我可以将它用作我的delegate / UnmanagedFunctionPointer ? 正如我所说的这段代码有效,但我想尽量少用外部DLL。 这是我的代码: Inno安装脚本 type TTimerProc=procedure(); TProgressCallback=procedure(progress:Integer); function WrapProgressProc(callback:TProgressCallback; paramcount:integer):longword; external ‘wrapcallback@files:innocallback.dll stdcall’; function Test(callback:longword): String; external ‘Test@files:ExposeTestLibrary.dll stdcall’; var endProgram : Boolean; procedure mycallback(progress:Integer); begin MsgBox(IntToStr(progress), mbInformation, MB_OK); if progress > 15 then begin endProgram := True; end end; function InitializeSetup:boolean; var progCallBack […]

如何将python回调传递给c#函数调用

我正在尝试使用python中的C#类,在mono / ubuntu上使用python.net。 到目前为止,我设法用一个参数工作做一个简单的函数调用。 我现在要做的是将python回调传递给C#函数调用。 我在下面尝试了以下变化,没有效果。 有人可以展示如何使这项工作? // C# – testlib.cs class MC { public double method1(int n) { Console.WriteLine(“Executing method1” ); /* .. */ } public double method2(Delegate f) { Console.WriteLine(“Executing method2” ); /* … do f() at some point … */ /* also tried f.DynamicInvoke() */ Console.WriteLine(“Done executing method2” ); } } Python脚本 […]

捕获异步回调中抛出的exception

我有一个方法,它采用一个回调参数异步执行,但catch块似乎没有捕获同步调用抛出的任何exception( this.Submit引用同步方法)。 public void Submit(FileInfo file, AnswerHandler callback) { SubmitFileDelegate submitDelegate = new SubmitFileDelegate(this.Submit); submitDelegate.BeginInvoke(file, (IAsyncResult ar) => { string result = submitDelegate.EndInvoke(ar); callback(result); }, null); } 有没有办法捕获新线程抛出的exception并将其发送到原始线程? 另外,这是处理异步exception的“正确”方法吗? 我编写了我的代码,因此可以像这样调用(假设exception问题已修复): try { target.Submit(file, (response) => { // do stuff }); } catch (Exception ex) { // catch stuff } 但有没有更合适或更优雅的方式来做到这一点?

C ++回调将文本发送回C#

我是C ++的新手。 我被告知使用C ++的“回调”是最好的解决方案。 这是我的情况。 我有一个用C ++编写的DLL 这个DLL有一个方法来启动通过C#代码运行的服务(这很好) 当DLL中的服务运行时,我希望DLL将文本传回C#代码,这只是进度代码,例如“第一阶段开始”和“第一阶段完成” 我环顾四周,并被告知实现这一点的最好方法是使用回调,我真的不知道如何实现这一点。 有没有人有任何建议或文章我可以看看? 请包含C ++,因为我没有C ++经验。 干杯

C#中的回调

我希望有一个库中有一个函数,它接受一个对象的参数。 使用此对象,我希望能够在X完成时调用指定的函数。 将被调用的函数由调用者指定,并且X将由库完成并监视。 我怎样才能做到这一点? 作为参考,我使用的是C#和.NET 3.5

当前的OperationContext在WCF Windows服务中为null

我正在尝试使用WCF设置发布/订阅系统,并且WCF服务器位于Windows服务中。 绑定是net.TCP。 该服务向客户端提供“订阅”方法,以便客户端可以将回调处理程序注册到将从链接到服务器的DLL引发的事件。 在Subscribe方法中,我尝试使用OperationContext.Current.GetCallbackChannel方法获取回调通道。 当我尝试这个时,OperationContext.Current属性返回NULL。 谁能告诉我在什么情况下这个属性会返回null? 我错过了设置吗? 我将在下面包含服务代码和接口代码。 我在Visual Studio 2012和目标框架4.5中使用c#。 服务: namespace WService { [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class WcfPublisherService : IWcfPublisherContract { IOALogic logic = new OAControlExample(); IWcfSubscriberContract _callback = null; public void Subscribe() { _callback = OperationContext.Current.GetCallbackChannel(); logic.BarriersChanged += logic_BarriersChanged; } public void UnSubscribe() { logic.BarriersChanged -= logic_BarriersChanged; } void logic_BarriersChanged(object sender, […]

如何在C#中引用事件

我有以下类,它有一个名为LengthChanged公共事件: class Dimension { public int Length { get { return this.length; } set { if (this.length != value) { this.length = value; this.OnLengthChanged (); } } protected virtual void OnLengthChanged() { var handler = this.LengthChanged; if (handler != null) { handler (this, System.EventArgs.Empty); } } public event System.EventHandler LengthChanged; private int length; } 我希望能够在一个名为Observer的方法中注册/取消注册此事件的处理程序,该方法对Dimension类一无所知。 […]

回调函数

我有一个名为funct的方法,当我在c#中使用isreceive套接字方法时,我希望将其作为我的回调函数。 s.BeginReceive(buffer, 0, buffer.Length, System.Net.Sockets.SocketFlags.None, new AsyncCallback(funct), null); 我得到的错误是: ‘funct’没有重载匹配委托’System.AsyncCallback’ 这可能是什么问题?