Хранение памяти в задачах дискретно - PullRequest
1 голос
/ 14 апреля 2011

В прошлом я много слышал о том, что программирование с помощью Threads и Tasks очень опасно для наивного.Ну, я наивен, но мне нужно учиться когда-нибудь.Я делаю программу (на самом деле это универсальный обработчик для ASP.Net), которая должна вызывать третье лицо и ждать ответа.Во время ожидания я хотел бы, чтобы обработчик продолжал делать некоторые другие вещи, поэтому я пытаюсь выяснить, как выполнить сторонний веб-запрос асинхронно.Основываясь на некоторых ответах на некоторые другие вопросы, которые я получил, вот что я придумал, но я хочу убедиться, что у меня не возникнет больших проблем, когда мой обработчик вызывается несколько раз одновременно.

Чтобы проверить это, я создал консольный проект.

class Program
{
    static void Main(string[] args)
    {
        RunRequestAsynch test = new RunRequestAsynch();
        test.TestingThreadSafety = Guid.NewGuid().ToString();

        Console.WriteLine("Started:" + test.TestingThreadSafety);

        Task tTest = new Task(test.RunWebRequest);
        tTest.Start();

        while (test.Done== false)
        {
            Console.WriteLine("Still waiting...");
            Thread.Sleep(100);
        }

        Console.WriteLine("Done. " + test.sResponse);

        Console.ReadKey();
    }
}

Я создаю отдельный объект (RunRequestAsynch), устанавливаю для него некоторые значения, а затем запускаю его.Пока это обрабатывается, я просто вывожу строку в окно консоли.

public class RunRequestAsynch
{
    public bool Done = false;
    public string sResponse = "";
    public string sXMLToSend = "";

    public string TestingThreadSafety = "";

    public RunRequestAsynch() { }


    public void RunWebRequest()
    {
        Thread.Sleep(500);
        // HttpWebRequest stuff goes here
        sResponse = TestingThreadSafety;
        Done = true;
        Thread.Sleep(500);

    }
}

Итак ... если я запускаю 1000 из них одновременно, я могу рассчитывать на то, что каждый экземпляр имеет свою собственную память и свойства, верно?И что строка "Done = true;"не сработает, и тогда все экземпляры Generic Handler умрут, верно?

Я написал файл .bat для запуска нескольких экземпляров, и указание, которое я установил для каждого конкретного объекта, похоже, осталось прежнимдля каждого случая - это то, что я хочу ... но я хочу убедиться, что я не делаю что-то действительно глупое, которое укусит меня в зад при полной нагрузке.

1 Ответ

1 голос
/ 14 апреля 2011

Я не вижу никаких явных проблем, однако следует рассмотреть возможность использования Factory.StartNew вместо Start . Каждое задание будет выполнено только один раз, поэтому проблем с одновременным выполнением нескольких задач не возникает.

Если вы хотите немного упростить свой код и воспользоваться Factory.StartNew, в вашем обработчике вы можете сделать что-то вроде этого (из того, что я помню о вашем последнем вопросе):

Task<byte[]> task = Task.Factory.StartNew<byte[]>(() =>    // Begin task
{
    //Replace with your web request, I guessed that it's downloading data
    //change this to whatever makes sense
    using (var wc = new System.Net.WebClient())
        return wc.DownloadData("Some Address");
});

//call method to parse xml, will run in parallel

byte[] result = task.Result;  // Wait for task to finish and fetch result.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...