Fire and Forget (Asynch) вызов метода ASP.NET

Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

7
задан BinaryHacker 12 October 2009 в 19:11
поделиться

5 ответов

Подробная информация о: http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx

В основном вы можете создать делегата, который указывает на метод, который вы хотите запустить асинхронно, а затем запустить его с помощью BeginInvoke.

// Declare the delegate - name it whatever you would like
public delegate void ProcessCustomerInfoDelegate();

// Instantiate the delegate and kick it off with BeginInvoke
ProcessCustomerInfoDelegate d = new ProcessCustomerInfoDelegate(ProcessCustomerInfo); 
simpleDelegate.BeginInvoke(null, null);

// The method which will run Asynchronously
void ProcessCustomerInfo()
{
   // this is where you can call your webservice 50 times
}
8
ответ дан 6 December 2019 в 23:10
поделиться

Я считаю, что проблема в том, что ваша веб-служба ожидает, что клиент вернет ответ, что сам вызов службы не является односторонним.

Если вы используете WCF для своих веб-служб, посмотрите http: // moustafa-arafa. blogspot.com/2007/08/oneway-operation-in-wcf.html для выполнения одностороннего вызова службы.

Мои два цента: ИМО, кто бы ни возложил на вас конструкцию, которой вы не являетесь возможность изменить интерфейс службы, чтобы добавить новый метод службы, предъявляет необоснованные требования. Даже если ваша служба является общедоступным API, добавление нового метода службы не должно влиять на существующих потребителей.

0
ответ дан 6 December 2019 в 23:10
поделиться

Это было то, что я взбил, чтобы сделать это ...


    public class DoAsAsync
    {
        private Action action;
        private bool ended;

        public DoAsAsync(Action action)
        {
            this.action = action;
        }

        public void Execute()
        {
            action.BeginInvoke(new AsyncCallback(End), null);
        }

        private void End(IAsyncResult result)
        {
            if (ended)
                return;

            try
            {
                ((Action)((AsyncResult)result).AsyncDelegate).EndInvoke(result);
            }
            catch
            {
                /* do something */
            }
            finally
            {
                ended = true;
            }
        }
    }

А затем

    new DoAsAsync(ProcessCustomerInfo).Execute();

Также необходимо установить свойство Async в директиве Page <% @ Page Async = "true"%>

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

3
ответ дан 6 December 2019 в 23:10
поделиться

Конечно, вы можете .

0
ответ дан 6 December 2019 в 23:10
поделиться
0
ответ дан 6 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

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