соединительная линия является строкой разработки, которая содержит последний исходный код и функции. Это должно иметь последние исправления ошибок в нем, а также последние опции, добавленные к проекту.
ответвления обычно используются, чтобы сделать что-то далеко от соединительной линии (или другая строка разработки), который был бы иначе повреждение сборка. Новые возможности часто создаются в ответвлении и затем объединились назад в соединительную линию. Ответвления часто содержат код, которые не обязательно утверждены для строки разработки, от которой он перешел. Например, программист мог попробовать оптимизацию на чем-то в ответвлении и только объединиться назад в строке разработки, как только оптимизация является удовлетворительной.
теги являются снимками репозитория в определенное время. Никакая разработка не должна происходить на них. Они чаще всего используются, чтобы сделать копию того, что было выпущено клиенту так, чтобы у Вас мог легко быть доступ к тому, что использует клиент.
Вот ссылка на очень хорошее руководство по репозиториям:
статьи в Википедии также стоит прочитать.
Каждый раз, когда вы делаете что-то асинхронно, вы используете отдельный поток, либо новый поток, либо поток, взятый из пула потоков. Это означает, что все, что вы делаете асинхронно, должно быть очень осторожным во взаимодействии с другими потоками.
Один из способов сделать это - разместить код для асинхронного потока (назовите его потоком «A») вместе со всеми его данные в другой класс (назовем его классом «A»). Убедитесь, что поток «A» имеет доступ только к данным в классе «A». Если поток «A» касается только класса «A», и никакой другой поток не касается данных класса «A», то возникает одна проблема меньше:
public class MainClass
{
private sealed class AsyncClass
{
private int _counter;
private readonly int _maxCount;
public AsyncClass(int maxCount) { _maxCount = maxCount; }
public void Run()
{
while (_counter++ < _maxCount) { Thread.Sleep(1); }
CompletionTime = DateTime.Now;
}
public DateTime CompletionTime { get; private set; }
}
private AsyncClass _asyncInstance;
public void StartAsync()
{
var asyncDoneTime = DateTime.MinValue;
_asyncInstance = new AsyncClass(10);
Action asyncAction = _asyncInstance.Run;
asyncAction.BeginInvoke(
ar =>
{
asyncAction.EndInvoke(ar);
asyncDoneTime = _asyncInstance.CompletionTime;
}, null);
Console.WriteLine("Async task ended at {0}", asyncDoneTime);
}
}
Обратите внимание, что единственная часть AsyncClass
, затронутая из снаружи - его публичный интерфейс, и единственная часть, которая является данными, - это CompletionTime
. Обратите внимание, что это только затрагивается после завершения асинхронной задачи. Это означает, что ничто другое не может мешать внутренней работе задач, и не может мешать ничему другому.
Вам необходимо использовать делегаты и BeginInvoke
], который они содержат, для асинхронного запуска другого метода. В конце метода, выполняемого делегатом, вы можете уведомить пользователя. Например:
class MyClass
{
private delegate void SomeFunctionDelegate(int param1, bool param2);
private SomeFunctionDelegate sfd;
public MyClass()
{
sfd = new SomeFunctionDelegate(this.SomeFunction);
}
private void SomeFunction(int param1, bool param2)
{
// Do stuff
// Notify user
}
public void GetData()
{
// Do stuff
sfd.BeginInvoke(34, true, null, null);
}
}
Прочтите на http://msdn.microsoft. com / en-us / library / 2e08f6yc.aspx
ThreadPool. QueueUserWorkItem - это самый быстрый способ запустить процесс в другом потоке.
Имейте в виду, что объекты пользовательского интерфейса имеют «сходство с потоками» и не могут быть доступны из любого потока, кроме того, который их создал.
Таким образом, помимо проверки ThreadPool (или использования модели асинхронного программирования через делегатов) , вам нужно проверить Диспетчеры (wpf) или InvokeRequired (winforms).
Вот две ссылки о многопоточности в C #
Я бы начал читать о BackgroundWorker class
В конце концов вам придется использовать какой-то поток. По сути, это работает так: вы запускаете функцию с новым потоком, и она будет выполняться до конца функции.
Если вы используете Windows Forms, то у них есть хорошая оболочка для этого - вызовите Background Worker. Он позволяет вам работать в фоновом режиме без блокировки формы пользовательского интерфейса и даже обеспечивает способ взаимодействия с формами и предоставления событий обновления хода выполнения.