我有一个应用程序通过自动化添加进行一些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)