в документации msdn написано что WebRequest вызывается синхронно. Как я понял, синхронные запросы вешают форму, в отличие от асинхронных. Что лучше использовать для решения этой проблемы: вызов WebRequest в новом потоке, или пару методов BeginGetResponse/EndGetResponse, которые вызываются асинхронно? насколько это актуально вообще? link
каюсь, на UI не проверял, задал вопрос на опережение. И все таки, для чего тогда нужны асинхронные вызовы?
Что бы выполнять множество поставленных задач, и вставать в "очередь". То есть не требуется ждать пока завершиться процесс A, одновременно можно начать обработку процессов B,C,D. Я предлагаю для начала ознакомиться с обозначением асинхронности в целом, задай в гугле - асинхронное программирование. Затем уже задай асинхронное программирование c# если потребуются примеры. Тут самое главное понять смысл - хотя он и не глубок. Вот тебе сцыль, тут пример с синхронным и асинхронным использованием вебреквеста. + рассказывают вкратце о плюшках в c#5:ТЫЦ
Перерыл довольно много информации, но так и не стало ясно что выгоднее использовать в простых web-приложениях. Насколько я понял, асинхронные вызовы дают максимально возможную производительность, но при более-менее больших объемах кода, их поддержка (обработка ошибок, запись в файл, использование общего объекта) выливается в большие трудности и код неимоверно разрастается. В отличие от этого, программирование с использованием новых потоков накладно по ресурсам, но зато код получается намного проще, так? Поправь мои рассуждения, если я что то упустил. Не знаю с какого варианта начать осваивать, пытаюсь найти плюсы и минусы каждого, чтобы выбрать.
Асинхронное построение приложений больше расчитано на логику. В то время как тридинг больше для вычеслительных мощей. Допустим у тебя есть 100 метровка, её бегут 2 человека. A- Asynchr B- Threading A- получает возможность выполнить 1 шага, после чего делает callback . И снова шагает B - получает определенное количество системного времени, допустим 1ms и делает за него такое количество шагов, сколько сможет.После чего пауза, после чего снова получает время. Если в целом то ты прав асинхронную логику более трудно реализовать, если у тебя есть множество модулей, которые взамодействуют друг с другом. А носчет того, что лучше - тут только пробывать и искать плюсы. Если мне надо написать какой нибудь небольшой скриптик - то я возьму многопоток и не буду париться. А если нужно, что то комплексное то... да фиг его знает, будет зависить от ситуации.А скорей всего получиться смешанное с использованием и того и другого. P.S. В WPF например, некторые моменты завязаные на UI можно реализовать только при помощи асинхронности.
С коннектами не проверял, но я думаю, что тоже. Считка данных из файла и привязка как евента, вот например: 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 ).
При добавлении контрола из потока(this.Controls.Add(picBox)), программы вылетает с ошибкой Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Form1' не из того потока, в котором он был создан. Что можно придумать?
вопрос по 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 РАЗОБРАЛСЯ сам, нужно было создавать группу в выражении, и обращатся к ней. Пример постом ниже.
подскажите на счет регулярки, как выдернуть эти числа? 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
держи! 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 походу и с этим разобрался
Для программы на C# нужно мне Popup сообщения сделать в сис. трее, чтобы была аватарка и текст сообщения, что-то похожее на QIP и прочие клиенты. Мне самому написать, если да, то как? Скачать готовый .net controls, но что-то гуглится плохо, есть какой-то хороший один или может быть сайт где можно скачать куча UI элементов для Visual C# и отсортировать их по категориям и популярности. Нужно чтобы текст сообщения желательно отображал\поддерживал форматирование
Скопилил библиотеку с содержимым 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
У тебя dll-ка managed, на шарпе написана. Такие дллки не импортируются через DllImport, через него можно только нативные импортировать. А шарповую дллку достаточно добавить в референсы - и ее неймспейс и методы станут доступны в программе.