如果我们像这样创建一个线程STA:Thread.SetApartmentState(STA);那么它就不能运行标有[MTAThread]属性的代码.
我们已经[STAThread]在Windows和控制台应用程序中看到过,但我从未见过具有[MTAThread]属性的代码,也不知道哪些.NET库使用此属性.
我的问题是,与具有MTA单元状态(自然.NET线程)的线程相比,将单元状态设置为STA的线程的局限性是什么?
运行[alternatives --config mta]时会出现以下屏幕.
There are 2 programs which provide 'mta'.
Selection Command
-----------------------------------------------
+ 1 /usr/sbin/sendmail.postfix
* 2 /usr/sbin/sendmail.sendmail
Enter to keep the current selection[+], or type selection number:
Run Code Online (Sandbox Code Playgroud)
星号是什么意思?
请帮我.
我的VPS提供程序(Slicehost)不提供SMTP服务器.我使用Google Apps为我的域发送和接收邮件,但我希望能够以编程方式发送电子邮件.
我一直在谷歌搜索这个问题好几个月,我似乎无法清楚地了解我需要做什么.我只需要像postfix这样的MTA吗?我将其配置为"卫星"或"互联网"网站吗?我是否需要进行任何DNS更改?如果我想有一天以编程方式接收电子邮件,是否有任何配置选项我应该小心修补?另外,如果我的VPS主机确实提供了一个SMTP服务器,我现在要做的不是我需要做什么?
谢谢!
编辑:我的发现的简要概述:
/etc/hosts并/etc/hostname反映FQDN(例如,mail.domain.com或sub.domain.com代替slicename)
hostname -fdig -x server.ip.addresssudo aptitude install postfix telnet mailx
mail whateveryouremailis@gmail.com虽然有很多关于COM和STA/MTA的问题(例如这里),但大多数人都在讨论具有UI的应用程序.但是,我有以下设置:
[MTAThread]属性).几个问题:
ConcurrentQueue.我有一个COM服务器(C++/STA(基于MFC的应用程序))和一个COM客户端(C#/ MTA).COM服务器必须位于STA中,因为它是一个MFC应用程序(在这个问题上我别无选择).客户端向服务器发出调用,服务器向客户端发出回调.这就是错误发生的地方(RPC_E_CANTCALLOUT_ININPUTSYNCCALL).我猜测服务器是否是MTA,这个问题永远不会出现,但遗憾的是,MFC的文档明确否认将公寓初始化为MTA.
关于如何解决这个问题的任何想法?
我一直在想让服务器对象(我通过运行对象表公开的对象)住在自己的公寓(MTA)中.这是一个好主意,还是先尝试一些简单的东西?
UPDATE
服务器对象只是指向应用程序中某些功能的精简界面.大多数情况下,它只是读取和写入内存位置,但有些情况下它会向应用程序中的各个窗口生成窗口消息.服务器对象本身不是整个应用程序.
我有一个 Windows 窗体应用程序。
现在我想使用一种async方法。
从 C# 7.1 开始,我可以使用一种async Main方法:https :
//docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7-1
但是,现在我的STAThread属性被忽略,我的应用程序在 MTA 中运行。这是设计使然还是我可以强制我的应用程序再次在 STA 模式下运行?
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
private static async Task Main(string[] args)
{
// returns MTA
Console.WriteLine("{0}", Thread.CurrentThread.ApartmentState);
}
Run Code Online (Sandbox Code Playgroud) 我在Visual Studio 2010中使用MSTest来处理需要将公寓线程模型设置为MTA的项目.
我已经在线查看了我发现并尝试过的项目似乎只适用于Visual Studio 2008和2005,请参阅http://blogs.msdn.com/b/ploeh/archive/2007/10/21/runningmstestinanmta. aspx.
谢谢
我想将 MTA 报告(未发送的退回邮件)附加到电子邮件中,但正确的 MIME 类型是什么?
我获取 MTA 报告的全文
$body = imap_fetchbody($this->Mailbox->stream, $this->header->uid, '', FT_UID);
Run Code Online (Sandbox Code Playgroud)
但是附加的 .eml 文件的正确 MIME 类型是什么?
已尝试message/rfc822,但当您在 Thunderbird 中打开文件时,弹出窗口为空。也尝试过text/plain,但附件以纯文本形式打开。我想以电子邮件形式打开附件 .eml
当您收到 MTA 报告(未送达)时,退回邮件始终作为附件转发
我想将完整的 MTA 报告 + 转发的退回邮件附加到新邮件中
我有这个简单的代码:
public void Run()
{
var invokerThread = new Thread(new ThreadStart(RunOnBackground));
invokerThread.Start();
}
private void RunOnBackground()
{
Trace.WriteLine("hi");
...
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当运行此代码(来自第三方进程)时,线程并没有真正运行.在进程资源管理器和VS调试器中,我看到线程已创建且其状态为"正在运行".
主线程的公寓是STA,我在内部线程上尝试了STA和MTA.
当我Run()在最后添加到方法时invokerThread.Join();,线程确实运行.但话说回来并没有真正帮助.
我错过了什么?
编辑:以下是有关代码托管的更多信息 -
Run() 方法是通过COM interop从一个进程调用的,该进程也是托管可执行程序集(使用COM互操作的原因是因为系统中的所有其他组件都是本机的).
该方法RunOnBackground()在跟踪之后包括一些代码,并且通常其执行持续10-20秒,包括启动另一个进程并等待其终止.此外,我在代码中还有一些其他区域,我将一些调试信息写入Trace.在调试代码时,Run()像往常一样运行并且在invokerThread.Start();invokerThread的状态为"Running"之后(尽管RunOnBackground()方法中的断点不会停止).
当我添加invokerThread.Join()在结束Run()方法调试器去RunOnBackground() 后的Join().
我在这里读到关于代表和事件(完全不同的原因)来自这个[网站] [1]在那里我得到的印象是,如果你的事件需要足够长的时间,就会生成一个单独的线程.那让我想到了一个我似乎无法解决的错误.所以我正在为我的MSR设备制作键盘楔程序,通过RS232端口进行通信.我创建了这个类来处理输入.
public ComPortInput(SerialPort sp, int delay)
: this(delay)
{
if (sp == null)
throw new System.ArgumentNullException("Serial port can not be null");
serialPort = sp;
}
Run Code Online (Sandbox Code Playgroud)
当我打开这个ComPortInput类时,我订阅了DataReceived事件.如果我正确猜测,那么如果我将延迟设置得足够高,那么我的dataevent将创建一个新线程.我认为通过查看我的代码可以最好地描述问题.
Program.cs中
[STAThread]
static void Main()
{
singleton = new System.Threading.Mutex(true, "Keymon");
if (!singleton.WaitOne(System.TimeSpan.Zero, true))
{ return; }
InstantiateProgram();
System.Windows.Forms.Application.Run(main);
}
private static void InstantiateProgram()
{
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
main = new frmMain();
}
Run Code Online (Sandbox Code Playgroud)
ComPortInput.cs.只是datareceived事件
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (Delay > 0)
System.Threading.Thread.Sleep(Delay); //waits for all the data to be sent to …Run Code Online (Sandbox Code Playgroud) 在vb.net WebService中查找内存泄漏时,我检测到阻塞的终结器,以及从未发布的几个对象(例如System.Threading.ReaderWriterLock)
Google告诉我这可能是因为STAThread属性是在我的main方法上设置的.我花了很长时间才发现VB.net使用STA作为默认值,而c#使用MTA.
当我将MTAThread-Attribute添加到我的Main方法时,一切正常,对象被释放.因此,如果我理解正确,则在STA模式中阻止Finalizer-Thread.
到目前为止一切顺利,但说实话,我今天第一次听说STA和MTA.可以在没有任何想法的情况下在STA和MTA之间切换吗?
更新 我仍然不确定我是否可以在不破坏我的代码的情况下在MTA和STA之间切换.这是一些更多的想法
mta ×13
sta ×7
c# ×6
email ×3
smtp ×3
.net ×1
async-await ×1
com ×1
com-interop ×1
events ×1
linux ×1
mime-types ×1
mstest ×1
php ×1
polymorphism ×1
postfix-mta ×1
protocols ×1
python ×1
service ×1
smtpd ×1
ubuntu ×1
vb.net ×1
visual-c++ ×1