小编JJ1*_*15k的帖子

从单线程进行COM调用会挂起线程

我有一个应用程序通过自动化添加进行一些excel自动化.这个加载项是多线程的,并且所有线程都设法调用excel COM对象.因为在进行多次调用时,excel有时会返回"忙碌"异常,所以我将所有调用都包含在"重试"函数中.但是我觉得这是有益的.我现在正在尝试在同一个线程上对excel对象进行所有调用,以便所有调用都被我"序列化",因此降低了excel返回"忙"异常的风险.但是,当此线程尝试访问excel对象时,应用程序将挂起.我已经尝试将线程设置为STA或MTA无济于事.

我用来从单个线程启动所有内容的代码如下:"冒犯"部分应该在"DoPass"中,也许我调用Delegate的方式在某种程度上是错误的.

public static class ExcelConnector
{
    public static Thread _thread;
    private static int ticket;
    public static Dictionary<Delegate, int> actionsToRun = new Dictionary<Delegate, int>();
    public static Dictionary<int, object> results = new Dictionary<int, object>();


    static ExcelConnector()
    {
        LaunchProcess();
    }

    public static int AddMethodToRun(Delegate method)
    {
        lock (actionsToRun)
        {
            ticket++;
            actionsToRun.Add(method, ticket);
        }
        return ticket;
    }

    public static bool GetTicketResult(int ticket, out object result)
    {
        result = null;
        if (!results.ContainsKey(ticket))
            return false;
        else
        {
            result = results[ticket];
            lock (results)
            {
                results.Remove(ticket); …
Run Code Online (Sandbox Code Playgroud)

c# com excel multithreading interop

3
推荐指数
1
解决办法
2473
查看次数

标签 统计

c# ×1

com ×1

excel ×1

interop ×1

multithreading ×1