Безопасность асинхронного статического вызова метода TPL - PullRequest
0 голосов
/ 05 октября 2011

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

Эти четыре асинхронных вызова статического метода должны быть потокобезопасными, верно?

    private void CheckStuff()
    {
        bool? res1, res2, res3, res4;

        // make 4 async calls to SomeServiceCall and wait for all
        Task[] tasks = new Task[]
                            {
                                Task.Factory.StartNew(() => res1 = SomeServiceCall("apple")),
                                Task.Factory.StartNew(() => res2 = SomeServiceCall("orange")),
                                Task.Factory.StartNew(() => res3 = SomeServiceCall("apple")),
                                Task.Factory.StartNew(() => res4 = SomeServiceCall("banana"))
                            };
        Task.WaitAll(tasks);
    }

    private static bool? SomeServiceCall(string someParam)
    {
        bool? retVal = null;

        var client = new SomeWcfClient();

        retVal = client.CheckSomething(someParam);

        return retVal;
    }

1 Ответ

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

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

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

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

private static bool? SomeServiceCall(string someParam)
{
    var client = new SomeWcfClient();
    return client.CheckSomething(someParam);
}
...