相关疑难解决方法(0)

[STAThread]做什么?

我正在学习C#3.5,我想知道[STAThread]我们的课程有什么用?

c# .net-attributes

277
推荐指数
3
解决办法
20万
查看次数

STAThread和多线程

来自有关STAThread的MSDN文章:

表示应用程序的COM线程模型是单线程单元(STA).

(作为参考,这是整篇文章.)

单线程公寓......好吧,我的头脑.另外,我在某处读到,除非你的应用程序使用COM互操作,否则这个属性实际上什么都不做.那究竟它究竟做了什么,以及它如何影响多线程应用程序?多线程应用程序(包括使用Timers到异步方法调用的任何人,而不仅仅是线程池等)都应该使用MTAThread,即使它"只是为了安全"?STAThread和MTAThread实际上做了什么?

.net c# multithreading sta

102
推荐指数
1
解决办法
8万
查看次数

什么是消息泵?

这个帖子(大约一年前发布)中,讨论了在非交互式会话中运行Word时可能遇到的问题.那里给出的(非常强烈的)建议不会这样做.在一篇文章中,它表示"Office API都假设您在桌面上的交互式会话中运行Office,具有监视器,键盘和鼠标,最重要的是消息泵." 我不确定那是什么.(我用C#编程只用了一年左右;我的其他编程经验主要是使用ColdFusion.)

更新:

我的程序运行大量RTF文件,以提取用于构建医疗报告编号的两条信息.我没有尝试弄清楚RTF中的格式化指令是如何工作的,而是决定只在Word中打开它们并从那里拉出文本(而不是实际启动GUI).有时,程序在处理一个文件的中间打嗝,并留下了一个字线打开该文件附有(我仍然要弄清楚如何关闭一个向下).当我重新运行程序时,我当然得到一个通知,说有一个线程正在使用该文件,我是否想要打开一个只读副本?当我说"是"时,Word GUI突然突然冒出来并开始处理文件.我想知道为什么会这样; 但看起来可能一旦弹出对话框,消息泵开始将主GUI推送到Windows?

c# winapi message-pump winmain

95
推荐指数
5
解决办法
4万
查看次数

Task.Run with Parameter(s)?

我正在开展一个多任务网络项目,我是新手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()

c# lambda task task-parallel-library

71
推荐指数
5
解决办法
11万
查看次数

Python tkinter.filedialog askfolder干扰clr

我主要在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"相关的问题,但我确实在代码中需要它.

类似的问题在这里问:https://github.com/pythonnet/pythonnet/issues/648

.net python tk-toolkit tkinter python.net

6
推荐指数
1
解决办法
471
查看次数

多个UI线程 - Winforms

我想在我的应用程序中创建多个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个这样的窗口并行显示实时数据.

解决方案 - 这样好吗?(根据msdnHans在下面评论)设置了公寓状态(见上面的代码)

protected override void OnClosed(EventArgs e)
{
    Application.Exit();
}
Run Code Online (Sandbox Code Playgroud)

c# user-interface multithreading winforms

5
推荐指数
1
解决办法
1万
查看次数