Это не делает действительно вопрос (можно вполне счастливо выполнить сайт с сетью/базой данных на той же машине), это - просто самый легкий шаг в масштабировании..
Это точно, что StackOverflow сделал - запускающийся с единственной машины, выполняющей IIS/SQL Server, тогда когда это начало в большой степени загружаться, второй сервер был куплен, и SQL-сервер перешелся на это.
, Если производительность не является проблемой, не тратьте впустую деньги, покупая/поддерживая два сервера.
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();
Использование пула потоков:
string str1 = "str1";
string str2 = "str2";
ThreadPool.QueueUserWorkItem(state =>
{
Console.WriteLine("{0}:{1}", str1, str2);
});
Если вы хотите выполнить некоторую альтернативную обработку потока с использованием пользовательского интерфейса, вам лучше всего использовать BackgroundWorker .
Существует делегат 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.
}
}
Я обычно создаю объект задачи примерно следующего вида
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)
{
}
}
}
Мне лично нравится маршрут делегата:
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);
}
Возможны следующие варианты:
Последнее, конечно, проще. Вы не показали, что вы делаете с потоком, но можете сделать что-то вроде:
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();
}
Если вы '