Как создать асинхронный метод

соединительная линия является строкой разработки, которая содержит последний исходный код и функции. Это должно иметь последние исправления ошибок в нем, а также последние опции, добавленные к проекту.

ответвления обычно используются, чтобы сделать что-то далеко от соединительной линии (или другая строка разработки), который был бы иначе повреждение сборка. Новые возможности часто создаются в ответвлении и затем объединились назад в соединительную линию. Ответвления часто содержат код, которые не обязательно утверждены для строки разработки, от которой он перешел. Например, программист мог попробовать оптимизацию на чем-то в ответвлении и только объединиться назад в строке разработки, как только оптимизация является удовлетворительной.

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

Вот ссылка на очень хорошее руководство по репозиториям:

статьи в Википедии также стоит прочитать.

51
задан Default 16 January 2013 в 02:37
поделиться

5 ответов

Каждый раз, когда вы делаете что-то асинхронно, вы используете отдельный поток, либо новый поток, либо поток, взятый из пула потоков. Это означает, что все, что вы делаете асинхронно, должно быть очень осторожным во взаимодействии с другими потоками.

Один из способов сделать это - разместить код для асинхронного потока (назовите его потоком «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 . Обратите внимание, что это только затрагивается после завершения асинхронной задачи. Это означает, что ничто другое не может мешать внутренней работе задач, и не может мешать ничему другому.

6
ответ дан 7 November 2019 в 10:02
поделиться

Вам необходимо использовать делегаты и 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

75
ответ дан 7 November 2019 в 10:02
поделиться

ThreadPool. QueueUserWorkItem - это самый быстрый способ запустить процесс в другом потоке.

Имейте в виду, что объекты пользовательского интерфейса имеют «сходство с потоками» и не могут быть доступны из любого потока, кроме того, который их создал.

Таким образом, помимо проверки ThreadPool (или использования модели асинхронного программирования через делегатов) , вам нужно проверить Диспетчеры (wpf) или InvokeRequired (winforms).

1
ответ дан 7 November 2019 в 10:02
поделиться

Вот две ссылки о многопоточности в C #

Я бы начал читать о BackgroundWorker class

4
ответ дан 7 November 2019 в 10:02
поделиться

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

Если вы используете Windows Forms, то у них есть хорошая оболочка для этого - вызовите Background Worker. Он позволяет вам работать в фоновом режиме без блокировки формы пользовательского интерфейса и даже обеспечивает способ взаимодействия с формами и предоставления событий обновления хода выполнения.

Фоновый рабочий

0
ответ дан 7 November 2019 в 10:02
поделиться
Другие вопросы по тегам:

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