Поточная обработка в c#

Это не делает действительно вопрос (можно вполне счастливо выполнить сайт с сетью/базой данных на той же машине), это - просто самый легкий шаг в масштабировании..

Это точно, что StackOverflow сделал - запускающийся с единственной машины, выполняющей IIS/SQL Server, тогда когда это начало в большой степени загружаться, второй сервер был куплен, и SQL-сервер перешелся на это.

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

5
задан Janmejay 4 September 2009 в 22:15
поделиться

6 ответов

ThreadStart threadStart = delegate{StartDNIThread(string storeID, string queryObject);};
Thread thread = new Thread(threadStart);
thread.Start();

Или с лямбдами:

ThreadStart threadStart = () => StartDNIThread(string storeID, string queryObject);
Thread thread = new Thread(threadStart);
thread.Start();
6
ответ дан 18 December 2019 в 09:51
поделиться

Использование пула потоков:

string str1 = "str1";
string str2 = "str2";
ThreadPool.QueueUserWorkItem(state =>
                            {
                               Console.WriteLine("{0}:{1}", str1, str2);
                            });

Если вы хотите выполнить некоторую альтернативную обработку потока с использованием пользовательского интерфейса, вам лучше всего использовать BackgroundWorker .

2
ответ дан 18 December 2019 в 09:51
поделиться

Существует делегат ParameterizedThreadStart, который вы можете использовать. Для этого делегата требуется метод, который принимает один аргумент (объекта tyoe). Итак, на самом деле вы можете использовать настраиваемый тип (класс или структура), который содержит 2 переменные, которые вы хотите передать в ParameterizedThreadStart.

Примерно так:

Thread t = new Thread (new ParameterizedThreadStart (DoWork));
t.Start(new MyType(storeId, queryObject));

Но в таких ситуациях я предпочитаю делать это в другой путь. Я предпочитаю создавать собственный тип «Задача», который абстрагирует все эти вещи. Как это:

public class Task
{

     private readonly int _storeId;
     private readonly string _queryObject;

     public Task(int storeId, string queryObject)
     {
         _storeId = storeId;
         _queryObject = queryObject;
     }

     public void Start()
     {
         Thread t = new Thread (new ThreadStart(DoWork));
         t.Start();
     }

     private void DoWork()
     {
         // Do your thing here.
     }

}
1
ответ дан 18 December 2019 в 09:51
поделиться

Я обычно создаю объект задачи примерно следующего вида

class myClass
{
    public void CallingCode()
    {
        ProcessRequest pr1 = new ProcessRequest("storeD","queryObj");
        ThreadStart ts1 = new ThreadStart(pr1.Go);
        Thread wrk = new Thread(ts1);
        wrk.Start();
    }
}


class ProcessRequest
{
    private string storeD;
    private string queryObj;

    public ProcessRequest(string storeD, string queryObj)
    {
        this.stroreD = storeD;
        this.queryObj = queryObj;
    }

    public void Go()
    {
        try
        {//your processing code here you can access $this->storeD and $this->queryObj

        }
        catch (Exception ex)
        {

        }
    }
}
0
ответ дан 18 December 2019 в 09:51
поделиться

Мне лично нравится маршрут делегата:

private delegate void StartDNIThreadDelegate(string storeID, string queryObject);

private static void Main()
{
    string storeID = "...";
    string queryObject = "...";
    StartDNIThreadDelegate startDNIThread = new StartDNIThreadDelegate(StartDNIThread);
    IAsyncResult result = startDNIThread.BeginInvoke(storeID, queryObject, new AsyncCallback(StartDNIThreadDone), startDNIThread);

    // Do non-threaded stuff...

    result.AsyncWaitHandle.WaitOne(); // wait for thread to finish.
}

private static void StartDNIThread(string storeID, string queryObject)
{
    // Do StartDNIThreading stuff.
}

private static void StartDNIThreadDone(IAsyncResult result)
{
    StartDNIThreadDelegate startDNIThread = (StartDNIThreadDelegate)result.AsyncState;

    // Do after thread finished cleanup.

    startDNIThread.EndInvoke(result);
}
0
ответ дан 18 December 2019 в 09:51
поделиться

Возможны следующие варианты:

  • Инкапсулировать параметры в новом классе и поместить метод, который будет использоваться для делегата в этот класс.
  • Использовать анонимные функции (анонимные методы или лямбда-выражения ), чтобы сделать то же самое автоматически с захваченными переменными.

Последнее, конечно, проще. Вы не показали, что вы делаете с потоком, но можете сделать что-то вроде:

string storeID = "...";
string queryObject = "...";

Thread t = new Thread(() => StartDNIThread(storeID, queryObject));
t.Start();

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

string storeID = "...";
string queryObject = "...";

string storeIDCopy = storeID;
string queryObjectCopy = queryObject;
Thread t = new Thread(() => StartDNIThread(storeIDCopy, queryObjectCopy));
t.Start();
// You can now change storeID and queryObject freely

Это особенно важно, если вы делаете что-либо в цикле, поскольку сами переменные цикла изменятся. Например:

foreach (string storeID in stores)
{
    string storeIDCopy = storeID;
    Thread t = new Thread(() => StartDNIThread(storeIDCopy, queryObject));
    t.Start();
}

Если вы '

8
ответ дан 18 December 2019 в 09:51
поделиться
Другие вопросы по тегам:

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