[ C# / Java ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by procedure, 2 Nov 2008.

  1. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    736
    Likes Received:
    73
    Reputations:
    19
    WebRequest.
     
  2. cyberXndr

    cyberXndr Member

    Joined:
    8 Jul 2012
    Messages:
    21
    Likes Received:
    5
    Reputations:
    6
    в документации msdn написано что WebRequest вызывается синхронно. Как я понял, синхронные запросы вешают форму, в отличие от асинхронных. Что лучше использовать для решения этой проблемы: вызов WebRequest в новом потоке, или пару методов BeginGetResponse/EndGetResponse, которые вызываются асинхронно?
    насколько это актуально вообще?
    link
     
    #1362 cyberXndr, 15 Jul 2012
    Last edited: 15 Jul 2012
  3. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    462
    Likes Received:
    38
    Reputations:
    1
    Вешают UI?О_о в обычных WebRequest'aх?
    Это как вы его используете, можно пример кода?
     
  4. cyberXndr

    cyberXndr Member

    Joined:
    8 Jul 2012
    Messages:
    21
    Likes Received:
    5
    Reputations:
    6
    каюсь, на UI не проверял, задал вопрос на опережение. И все таки, для чего тогда нужны асинхронные вызовы?
     
  5. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    462
    Likes Received:
    38
    Reputations:
    1
    Что бы выполнять множество поставленных задач, и вставать в "очередь". То есть не требуется ждать пока завершиться процесс A, одновременно можно начать обработку процессов B,C,D.

    Я предлагаю для начала ознакомиться с обозначением асинхронности в целом, задай в гугле - асинхронное программирование. Затем уже задай асинхронное программирование c# если потребуются примеры. Тут самое главное понять смысл - хотя он и не глубок.
    Вот тебе сцыль, тут пример с синхронным и асинхронным использованием вебреквеста. + рассказывают вкратце о плюшках в c#5:ТЫЦ
     
    1 person likes this.
  6. cyberXndr

    cyberXndr Member

    Joined:
    8 Jul 2012
    Messages:
    21
    Likes Received:
    5
    Reputations:
    6
    Перерыл довольно много информации, но так и не стало ясно что выгоднее использовать в простых web-приложениях. Насколько я понял, асинхронные вызовы дают максимально возможную производительность, но при более-менее больших объемах кода, их поддержка (обработка ошибок, запись в файл, использование общего объекта) выливается в большие трудности и код неимоверно разрастается. В отличие от этого, программирование с использованием новых потоков накладно по ресурсам, но зато код получается намного проще, так? Поправь мои рассуждения, если я что то упустил. Не знаю с какого варианта начать осваивать, пытаюсь найти плюсы и минусы каждого, чтобы выбрать.
     
  7. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    462
    Likes Received:
    38
    Reputations:
    1
    Асинхронное построение приложений больше расчитано на логику. В то время как тридинг больше для вычеслительных мощей. Допустим у тебя есть 100 метровка, её бегут 2 человека.
    A- Asynchr
    B- Threading

    A- получает возможность выполнить 1 шага, после чего делает callback . И снова шагает
    B - получает определенное количество системного времени, допустим 1ms и делает за него такое количество шагов, сколько сможет.После чего пауза, после чего снова получает время.
    Если в целом то ты прав асинхронную логику более трудно реализовать, если у тебя есть множество модулей, которые взамодействуют друг с другом.
    А носчет того, что лучше - тут только пробывать и искать плюсы. Если мне надо написать какой нибудь небольшой скриптик - то я возьму многопоток и не буду париться. А если нужно, что то комплексное то... да фиг его знает, будет зависить от ситуации.А скорей всего получиться смешанное с использованием и того и другого.
    P.S. В WPF например, некторые моменты завязаные на UI можно реализовать только при помощи асинхронности.
     
  8. cyberXndr

    cyberXndr Member

    Joined:
    8 Jul 2012
    Messages:
    21
    Likes Received:
    5
    Reputations:
    6
    это, например, доступ к статус бару со всех коннектов? или нет?
     
  9. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    462
    Likes Received:
    38
    Reputations:
    1
    С коннектами не проверял, но я думаю, что тоже. Считка данных из файла и привязка как евента, вот например:
    Code:
    public event EventHandler LoadCompleted;
    
    //Обычная вычитка данных
    public bool LoadDiaFile(string fileName)
    		{
                
    			DiaReader reader = new DiaReader();
    			DiaContent = reader.LoadDiaFile(fileName);
                
    			DiaContent = CheckDiaContent(DiaContent, null);
    
    			if (LoadCompleted != null)
    				LoadCompleted(this, EventArgs.Empty);
    
    			return DiaContent != null ? true : false;
    		} 
    
    //Asynchron
    
    public bool LoadDiaFileAsync(string fileName)
    		{
    			BackgroundWorker bw = new BackgroundWorker();
    			bw.DoWork += (sender, e) =>
    				{
    					DiaReader reader = new DiaReader();
    					e.Result = reader.LoadDiaFile(fileName);
    				};
    			bw.RunWorkerCompleted += (sender, e) =>
    				{
    					DiaContent = e.Result as DiaReader.DiaContent;
    					CheckDiaContent(DiaContent, null);
    
    					if (LoadCompleted != null)
    						LoadCompleted(this, EventArgs.Empty);
    					bw.Dispose();
    				};
    
    			bw.RunWorkerAsync();
    			return DiaContent != null ? true : false;
    		}
    
    
    Вообщем если тебе нужно создать несколько каналов и получать от них информацию в real time в связки с UI, то без BackGroundworker/Dispatcher не обойтись.
    Советую почитать ещё здесь про потокобезопасноть(Вниманиие WinForms and WPF ).
     
  10. cyberXndr

    cyberXndr Member

    Joined:
    8 Jul 2012
    Messages:
    21
    Likes Received:
    5
    Reputations:
    6
    ок, спасибо, буду разбираться
     
    2 people like this.
  11. cipa21

    cipa21 Elder - Старейшина

    Joined:
    9 Apr 2009
    Messages:
    548
    Likes Received:
    146
    Reputations:
    30
    При добавлении контрола из потока(this.Controls.Add(picBox)), программы вылетает с ошибкой Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Form1' не из того потока, в котором он был создан.
    Что можно придумать?
     
  12. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    939
    Likes Received:
    162
    Reputations:
    27
    Работать с UI можно только из главного потока.
     
  13. cipa21

    cipa21 Elder - Старейшина

    Joined:
    9 Apr 2009
    Messages:
    548
    Likes Received:
    146
    Reputations:
    30
    получается что создать, допустим, кнопку из потока невозможно?
     
  14. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    462
    Likes Received:
    38
    Reputations:
    1
    Подобное как раз обсуждалось выше, советую прочитать вот тут:Тыц

    довольно неплохо описано.
     
  15. cyberXndr

    cyberXndr Member

    Joined:
    8 Jul 2012
    Messages:
    21
    Likes Received:
    5
    Reputations:
    6
    вопрос по regexp
    есть такой вот класс-обертка
    Code:
    class TRegExp
            {
                public string result;
                public override string ToString()
                {
                    return result;
                }
                public TRegExp(string pattern, string text)
                {
                    Regex re = new Regex(pattern);
                    Match mc = re.Match(text);
                    result = mc.ToString();
                }
            }
    
    есть такая вот строка с текстом
    Code:
    string text = "satanclaus<1>hello<2>lalala"
    есть такой вот вызов
    Code:
    TRegExp cleared = new TRegExp("<1>.*<2>", text);
    Console.WriteLine(cleared);
    в результате выводит <1>hello<2>
    Собственно вопрос: что нужно модифицировать в классе, чтобы выводилось только hello, без ограничителей?

    p.s РАЗОБРАЛСЯ сам, нужно было создавать группу в выражении, и обращатся к ней. Пример постом ниже.
     
    #1375 cyberXndr, 19 Jul 2012
    Last edited: 19 Jul 2012
  16. CheatXX

    CheatXX New Member

    Joined:
    8 Jun 2009
    Messages:
    154
    Likes Received:
    2
    Reputations:
    0
    подскажите на счет регулярки, как выдернуть эти числа?

    PHP:
    <span><input id="i03afdbd66e7929b125f8597834fa83a4" type="hidden" name="x03afdbd66e7929b125f8597834fa83a4" value="1393210d01359b4aa89224e25114154b" />
    <
    input id="ib1d10e7bafa4421218a51b1e1f1b0ba2" type="hidden" name="xb1d10e7bafa4421218a51b1e1f1b0ba2" value="7a143cd72f48d47966aa9f61310d470a" />
    <
    input id="ic86a7ee3d8ef0b551ed58e354a836f2b" type="hidden" name="xc86a7ee3d8ef0b551ed58e354a836f2b" value="3f4736febf73e518a25bc6962f9801f5" />
    </
    span>
    т.е из name и value
     
  17. cyberXndr

    cyberXndr Member

    Joined:
    8 Jul 2012
    Messages:
    21
    Likes Received:
    5
    Reputations:
    6
    держи!
    Code:
    string text = "<span><input id=\"i03afdbd66e7929b125f8597834fa83a4\" type=\"hidden\" name=\"x03afdbd66e7929b125f8597834fa83a4\" value=\"1393210d01359b4aa89224e25114154b\" /><input id=\"ib1d10e7bafa4421218a51b1e1f1b0ba2\" type=\"hidden\" name=\"xb1d10e7bafa4421218a51b1e1f1b0ba2\" value=\"7a143cd72f48d47966aa9f61310d470a\" /><input id=\"ic86a7ee3d8ef0b551ed58e354a836f2b\" type=\"hidden\" name=\"xc86a7ee3d8ef0b551ed58e354a836f2b\" value=\"3f4736febf73e518a25bc6962f9801f5\" /></span>";
    Match m = Regex.Match(text, "name=\"(.*?)\" value=\"(.*?)\"");
    while (m.Success)
    {
        Console.WriteLine(m.Groups[1] + " " + m.Groups[2]);
        m = m.NextMatch();
        }
    Console.ReadLine();
    
    еще один вопрос к знающим людям: почему надо использовать именно (.*?), а не (.*)? Все должно подходить, но почему то не подходит...
    p.s походу и с этим разобрался
     
    #1377 cyberXndr, 19 Jul 2012
    Last edited: 19 Jul 2012
  18. wMw_

    wMw_ New Member

    Joined:
    1 Jun 2009
    Messages:
    41
    Likes Received:
    3
    Reputations:
    0
    Для программы на C# нужно мне Popup сообщения сделать в сис. трее, чтобы была аватарка и текст сообщения, что-то похожее на QIP и прочие клиенты.

    Мне самому написать, если да, то как?
    Скачать готовый .net controls, но что-то гуглится плохо, есть какой-то хороший один или может быть сайт где можно скачать куча UI элементов для Visual C# и отсортировать их по категориям и популярности.

    Нужно чтобы текст сообщения желательно отображал\поддерживал форматирование
     
  19. cipa21

    cipa21 Elder - Старейшина

    Joined:
    9 Apr 2009
    Messages:
    548
    Likes Received:
    146
    Reputations:
    30
    Скопилил библиотеку с содержимым
    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace test_lib
    {
        public class Test
        {
            private int a = 4;
            public void print()
            {
                Console.WriteLine(a.ToString());
            }
        }
    }
    Создал проект, закинул test_lib.dll в папку bin/debug
    Code:
    using System;
    using System.Collections.Generic;
    using System.Runtime.InteropServices; 
    using System.Linq;
    using System.Text;
    
    namespace test_csharp
    {
        class Program
        {
            [DllImport("test_lib.dll")]
            public static extern void Test();
    
            static void Main(string[] args)
            {
                Test();
            }
        }
    }
    
    И нифига не работает. Вы дает ошибку на строке Test();
    "Дополнительные сведения: Не удается найти точку входа "Test" в DLL "test_lib.dll"."

    Помогите пожалуйста, желательно примером а не ссылками. Гугл толкового ничего не подсказал.


    PS. Вопрос решен!
    Может кому нужно будит.
    Добавил DLL в Ссылки и прописал в проекте using test_lib
     
    #1379 cipa21, 26 Jul 2012
    Last edited: 26 Jul 2012
  20. GRRRL Power

    GRRRL Power Moderator

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    У тебя dll-ка managed, на шарпе написана. Такие дллки не импортируются через DllImport, через него можно только нативные импортировать. А шарповую дллку достаточно добавить в референсы - и ее неймспейс и методы станут доступны в программе.
     
    _________________________
    1 person likes this.
Loading...