Насколько неправильно использование такого кода - PullRequest
0 голосов
/ 21 октября 2011

Я получил код для вызова асинхронных блоков.

    private delegate void MyDelegate();
    void Async(MyDelegate t) {
        Thread thread = new Thread(new ThreadStart(t));
        thread.IsBackground = true;
        thread.Start();
    }

А потом:

Async(delegate() {
    // code
});

Я использую его, но я уверен, что это неправильный способ сделать это.Какие проблемы с этим методом?

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Кажется, нет смысла объявлять своего представителя, во-первых. Почему бы просто:

void Async(ThreadStart t) {
    Thread thread = new Thread(t);
    thread.IsBackground = true;
    thread.Start();
}

? Лично я не вижу себя желающим делать это достаточно часто (и с нет способом узнать, как продвигается задача), чтобы оправдать отдельный метод. Если вы используете .NET 4, вам следует обратиться к параллельной библиотеке задач, которая по-прежнему позволяет запускать асинхронные задачи, но более полнофункциональным способом. (РЕДАКТИРОВАТЬ: Хорошо, так что вы не можете использовать это из .NET 2 - это стоит иметь в виду на будущее, хотя.)

Вы также можете рассмотреть возможность использования метода BeginInvoke для делегатов, который в любом случае позволяет легко запускать их в пуле потоков - и передают аргументы:

Action<string, int> action = (name, age) => { ... };

IAsyncResult result = action.BeginInvoke("Jon", 35, null);
// Now you can use result if you want...

РЕДАКТИРОВАТЬ: Теперь вы сказали, что будете делать это несколько раз в секунду. Предполагая, что это кратковременная задача, вы почти наверняка должны использовать для этого пул потоков. Как и в примере выше, вы также можете использовать ThreadPool.QueueUserWorkItem, чтобы добавить задачу в пул потоков. Это будет более эффективно (через повторное использование потоков), чем создание нового потока каждый раз, когда у вас есть задача.

1 голос
/ 21 октября 2011

Так как у вас уже есть делегат

private delegate void MyDelegate();

, вы можете сделать это

new MyDelegate(delegate
{
    // code
}).BeginInvoke(null, null);

Он будет использовать потоки пула потоков, чтобы вы не перегружали среду выполнения слишкоммного тем.

...