来自有关STAThread的MSDN文章:
表示应用程序的COM线程模型是单线程单元(STA).
(作为参考,这是整篇文章.)
单线程公寓......好吧,我的头脑.另外,我在某处读到,除非你的应用程序使用COM互操作,否则这个属性实际上什么都不做.那究竟它究竟做了什么,以及它如何影响多线程应用程序?多线程应用程序(包括使用Timers到异步方法调用的任何人,而不仅仅是线程池等)都应该使用MTAThread,即使它"只是为了安全"?STAThread和MTAThread实际上做了什么?
在这个帖子(大约一年前发布)中,讨论了在非交互式会话中运行Word时可能遇到的问题.那里给出的(非常强烈的)建议不会这样做.在一篇文章中,它表示"Office API都假设您在桌面上的交互式会话中运行Office,具有监视器,键盘和鼠标,最重要的是消息泵." 我不确定那是什么.(我用C#编程只用了一年左右;我的其他编程经验主要是使用ColdFusion.)
我的程序运行大量RTF文件,以提取用于构建医疗报告编号的两条信息.我没有尝试弄清楚RTF中的格式化指令是如何工作的,而是决定只在Word中打开它们并从那里拉出文本(而不是实际启动GUI).有时,程序在处理一个文件的中间打嗝,并留下了一个字线打开该文件附有(我仍然要弄清楚如何关闭一个向下).当我重新运行程序时,我当然得到一个通知,说有一个线程正在使用该文件,我是否想要打开一个只读副本?当我说"是"时,Word GUI突然突然冒出来并开始处理文件.我想知道为什么会这样; 但看起来可能一旦弹出对话框,消息泵开始将主GUI推送到Windows?
我正在开展一个多任务网络项目,我是新手Threading.Tasks.我实现了一个简单的Task.Factory.StartNew(),我想知道我该怎么做Task.Run()?
这是基本代码:
Task.Factory.StartNew(new Action<object>(
(x) =>
{
// Do something with 'x'
}), rawData);
Run Code Online (Sandbox Code Playgroud)
我System.Threading.Tasks.Task在对象浏览器中查看,我找不到Action<T>类似的参数.只有Action这需要void参数,没有类型.
只有两件事情similiar:static Task Run(Action action)和static Task Run(Func<Task> function),但不能发布与两个参数(一个或多个).
是的,我知道我可以,但创建一个简单的扩展方法,我的主要问题是,我们可以把它写在一行用Task.Run()?
我主要在Spyder工作,构建需要弹出文件夹或文件浏览窗口的脚本.
下面的代码在spyder中完美运行.在Pycharm,askopenfilename运作良好,而askdirectory什么都不做(卡住).但是,如果在调试模式下运行 - 脚本运行良好.我试图从SAS jsl运行脚本 - 同样的问题.
任何想法我该怎么办?Python 3.6 Pycharm 2017.2
谢谢.
我使用的准则包括:
import clr #pythonnet 2.3.0
import os
import tkinter as tk
from tkinter.filedialog import (askdirectory,askopenfilename)
root = tk.Tk()
root.withdraw()
PPath=askdirectory(title="Please select your installation folder location", initialdir=r"C:\Program Files\\")
t="Please select jdk file"
if os.path.exists(os.path.expanduser('~\Documents')):
FFile = askopenfilename(filetypes=(("jdk file", "*.jdk"),("All Files", "*.*")),title=t, initialdir=os.path.expanduser('~\Documents'))
else:
FFile= askopenfilename(filetypes=(("jdk file", "*.jdk"),("All Files", "*.*")),title=t)
sys.path.append(marsDllPath)
a = clr.AddReference('MatlabFunctions')
aObj = a.CreateInstance('Example.MatlabFunctions.MatLabFunctions')
Run Code Online (Sandbox Code Playgroud)
编辑:似乎与pythonnet"imoprt clr"相关的问题,但我确实在代码中需要它.
我想在我的应用程序中创建多个UI线程.我已经模拟了如下方案.我正在后台线程中单击按钮创建一个新窗口/窗体
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var thread = new Thread(() =>
{
Form f = new Form();
Application.Run(f);
});
// thread.IsBackground = true; -- Not required. See Solution below
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意 - 我正在做IsBackground = true因为当用户在主窗体上关闭时,子窗体/窗口也应该关闭.是否有更清洁/优雅的方式来实现同样的目标?
编辑 - 我想为每个窗口创建专用的UI线程.我将有10个这样的窗口并行显示实时数据.
解决方案 - 这样好吗?(根据msdn和Hans在下面的评论)设置了公寓状态(见上面的代码)
protected override void OnClosed(EventArgs e)
{
Application.Exit();
}
Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×2
lambda ×1
message-pump ×1
python ×1
python.net ×1
sta ×1
task ×1
tk-toolkit ×1
tkinter ×1
winapi ×1
winforms ×1
winmain ×1