Каков объем потока финализатора - на домен приложения или для каждого процесса?

  1. Не существует свойства / метода Range.Set. Это неверно, поэтому я не включил его, когда попытался исправить ваш вопрос, включив в него код из ваших комментариев.
  2. Синтаксис .Range является просто продолжением оператора With wb.Sheets("Open Quote"); поэтому .Range фактически означает wb.Sheets("Open Quote").Range.
  3. Когда вы звоните Range (без .), вы используете неявную ссылку на активный лист; Поскольку вы только что открыли файл, который вы называете wb, активный лист в нем теперь активен, а не лист / книга, которая была активна при запуске подпрограммы.

    См. Ссылку: избегать неявного кода

  4. Итак, на какой книге / листе должен быть Range(L3)?

  5. Вы никогда не тестируете, чтобы увидеть if cell is nothing then или фактически используете cell где-нибудь в вашем коде после этого.


  6. Всякий раз, когда вы сталкиваетесь с проблемами, вы должны установить точку останова (F9) перед проблемой и использовать F8 для перехода по одной строке за раз.

    Вы можете навести курсор мыши на переменные, добавить Watch и / или использовать Debug.Print для отображения значений в непосредственном окне (Ctrl + G).

    Попробуйте,

    Debug.Print .Range("L3").Parent & ".Range(" & .Range("L3").Address & ")"
    Debug.Print Range("A1:BA350").Parent & ".Range(" & Range("A1:BA350").Address & ")"
    Debug.Print cell.Parent & ".Range(" & cell.Address & ")"
    

    Пожалуйста, измените вопрос, включив в него код, который вы используете в настоящее время.

    (лучше включить Option Explicit)

14
задан Sunny Milenov 27 October 2008 в 22:04
поделиться

1 ответ

Похож на него, действительно всего один поток на экземпляр CLR в рамках процесса - в данный момент, так или иначе. Вот некоторый код, чтобы показать что:

Test.cs:

using System;

class Test
{
    static void Main()
    {
        AppDomain.CreateDomain("First")
                 .ExecuteAssembly("ShowFinalizerThread.exe");
        AppDomain.CreateDomain("Second")
                 .ExecuteAssembly("ShowFinalizerThread.exe");
    }
}

ShowFinalizerThread.cs:

using System;
using System.Threading;

class ShowFinalizerThread
{
    static Random rng = new Random();

    ~ShowFinalizerThread()
    {
        Console.WriteLine("Thread/domain: {0}/{1}",
                          Thread.CurrentThread.ManagedThreadId,
                          AppDomain.CurrentDomain.FriendlyName);
        if (rng.Next(10) == 0)
        {
            Console.WriteLine("Hanging!");
            Thread.Sleep(2000);
        }
    }

    static void Main()
    {
        new Thread(LoopForever).Start();
    }

    static void LoopForever()
    {
        while (true)
        {
            new ShowFinalizerThread();
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Thread.Sleep(300);
        };
    }
}

Скомпилируйте каждого как консольное приложение, затем работайте, test.exe (из командной строки является самым легким, IMO). Вы будете видеть что блоки финализатора домена приложения другой.

В будущем я не был бы удивлен видеть один поток финализатора на ядро, а не на AppDomain - но это кажется, что у Вас все еще будут проблемы :(

У Вас есть мои глубокие соболезнования (хотя не решение) - после того как я разыскал мертвую блокировку в Блобе Oracle. Мы смогли зафиксировать это путем избавления от него правильно, но я знаю не, все работает, что приятно - и это была реальная боль, даже находящая что один!

8
ответ дан 1 December 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: