如何在OpenEdge中使用多线程.NET对象

问题描述:

我正在使用.NET SmtpClient类从AppServer过程发送电子邮件。我已经实现了一些简单的代码来测试,基于这里发现的语法:https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient(v=vs.110).aspx如何在OpenEdge中使用多线程.NET对象

所有的OpenEdge语法都是正确的(使用类浏览器,它很容易翻译代码),但问题行在这里:

mailClient:send(mailMessage). 

运行时显示以下错误代码:

您试图在不支持的方式使用多线程的.NET对象。 ABL不能在主线程以外的线程上调用。 (15740) ABL是单线程的。如果使用使用多个线程的.NET对象并尝试在主线程以外的线程上回调ABL,则会看到此错误。

我的问题是你如何使用ABL中的多线程.NET对象,因为它是单线程的。

最初的文档建议使用WAIT-FOR语句,但是这并没有改变结果。

+0

我有点困惑,看着[MSDN网站的SmtpClient](https://msdn.microsoft.com/en-us/library/x5x13z6h(v = vs.110).aspx)它看起来像像'send'方法不是异步的,有一个特殊的'SmtpClient.SendAsync'方法,还有许多其他的方法,前缀'Async'!? – xander

没有简单的答案。如果你不需要方法的响应,你可以在C#中创建一个包装方法。如果你需要send方法的响应,你将会在AppServer上失败 - 因为这需要线程同步只能用于WinForm控件。

+0

啊我看到了。我需要回复来检查电子邮件是否已发送,并且没有发生错误。那么这个检查也需要用C#包装起来? –

+0

是的。 ABL根本无法使用后台线程 –