2 / 2 / 1
Регистрация: 24.05.2012
Сообщений: 90
1

Вызов async метода

14.08.2013, 17:02. Показов 1860. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую. Возникла проблема. Пишу под WP8 (прошу тему не переносить ибо в том разделе никого почти нет, да и тут тот же wpf или Silverlight) и создал в отдельном файле класс с async методом, который вообщем делает запрос далекий и получает JSON и в итоге выводит hello в textblock. Но проблема вот в чем - данный метод я хочу вызывать при нажатии кнопки. если я напишу код метода в классе данной страницы приложения в событии
C#
1
private async void button_click (...) {...}
то все супер, а вот если я как я писал выше, создам метод в отдельном классе и там будет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class test 
{
public async void getHello()
{
MainPage MP = new MainPage();
MP.textblock.text = "hello"
}
}
/****MainPage класс ****/
private async void button_click (...) 
{
test ts = new test();
ts.getHello();
}
то вылетает дебагер и вообщем то из консоли видно, что там вылетел System.NullReferenceException
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2013, 17:02
Ответы с готовыми решениями:

Вызов метода в коде
Добрый день,уважаемые форумчане!К сожалению я не программист и осваивать Си Шарп начал совсем...

Вызов метода в коде MainWindow
Не получается вызвать конструктор внутри MainWindow. Ошибка IDE1007 Имя "Create" не существует в...

Вызов метода у UserControl из ViewModel
Есть библиотека пользовательских элементов управления. В ней EventLogControl и AnimationControl. В...

Вызов метода из другого класса
Вопрос наверняка не сложный для тех, кто понимает ООП. Я пока не силен в этом, поэтому спрошу...

6
4 / 4 / 0
Регистрация: 28.05.2012
Сообщений: 43
14.08.2013, 22:08 2
меркер async применятся к методу в котором происходит вызов асинхронных операций, короче говоря он сообщает компилятору о необходимости трактовать await как ключевое слово. А у вас я не вижу вызова асинхронных функций, или я чего то не понимаю?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.08.2013, 02:15 3
Jariel, это должно выглядеть примерно так

C#
1
2
3
4
5
6
7
8
9
10
11
Task<string> MyMethod()
{
   return Task.Factory.StartNew(() => GetFarJSON());
}
 
...
 
async void Button1_Click(...)
{
   textbox1.Text = await MyMethod();
}
0
2 / 2 / 1
Регистрация: 24.05.2012
Сообщений: 90
15.08.2013, 10:21  [ТС] 4
Цитата Сообщение от Psilon Посмотреть сообщение
Jariel, это должно выглядеть примерно так

C#
1
2
3
4
5
6
7
8
9
10
11
Task<string> MyMethod()
{
   return Task.Factory.StartNew(() => GetFarJSON());
}
 
...
 
async void Button1_Click(...)
{
   textbox1.Text = await MyMethod();
}
не помогло... хотя выглядит все логично и должно было работать
C#
1
2
3
4
5
JObject json = JObject.Parse(result.ToString());
            
            // JObject json = JObject.Parse(result.ToString());
            Task<string> str =  Task.Factory.StartNew(() => (string)json["data"][0]["body"] ); 
            return await str;
C#
1
2
GetMessages GM = new GetMessages();
            ChatBlock.Text = await GM.getMes();
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.08.2013, 11:18 5
Jariel, омг, await должен быть только в вызывающем коде!! Я ж пример написал

C#
1
2
3
4
5
JObject json = JObject.Parse(result.ToString());
            
            // JObject json = JObject.Parse(result.ToString());
            Task<string> str =  Task.Factory.StartNew(() => (string)json["data"][0]["body"] ); 
            return str;
0
2 / 2 / 1
Регистрация: 24.05.2012
Сообщений: 90
15.08.2013, 11:23  [ТС] 6
Цитата Сообщение от Psilon Посмотреть сообщение
Jariel, омг, await должен быть только в вызывающем коде!! Я ж пример написал

C#
1
2
3
4
5
JObject json = JObject.Parse(result.ToString());
            
            // JObject json = JObject.Parse(result.ToString());
            Task<string> str =  Task.Factory.StartNew(() => (string)json["data"][0]["body"] ); 
            return str;
выдает компилятор ошибку без await str
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.08.2013, 14:05 7
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Net.NetworkInformation;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication3
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
 
    public class Form1 : Form
    {
        public Form1()
        {
            var textBox = new TextBox {Width = 9*Width/10, Height = 9*Height/10, ReadOnly = true, Multiline = true};
            Controls.Add(textBox);
 
            textBox.Text += "Начало" + Environment.NewLine;
            Foo(x => textBox.Text += "Пинг выполнен с рзезультатом " + x + Environment.NewLine);
            textBox.Text += "Выход из конструктора" + Environment.NewLine;
        }
 
        private async void Foo(Action<long> action)
        {
            var res = await YandexPing();
            action(res);
        }
 
        private Task<long> YandexPing()
        {
            return Task.Factory.StartNew(new Func<long>(LongPing));
        }
 
        private long LongPing()
        {
            const string url = "yandex.ru";
            Ping ping = new Ping();
            PingReply pingReply;
            try
            {
                pingReply = ping.Send(url);
            }
            catch (PingException)
            {
                return -1;
            }
            Thread.Sleep(new Random().Next(5000, 10000));
            if (pingReply != null)
                return pingReply.RoundtripTime;
            return -1;
        }
    }
}
0
15.08.2013, 14:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2013, 14:05
Помогаю со студенческими работами здесь

Вызов метода сразу после загрузки окна
Мне нужно чтобы метод PrimaryData(); отработал сразу после инициализации окна. Можна ли это сделать...

Выполнение метода в отдельном потоке без await/async
В десктопном WPF проекте с .Net 4.0 необходимо сделать так: private void...

Вызов из c# метода в Dll с++
Доброго времени суток, нужна помощь имеется ДЛЛ написанная на с++ И мои труды написанные на C#.В...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru