|
Hey all,
Got some strange behavior going on. I have a simple web page that has to import some fairly complex javascript from a 3rd party I am integrating our product with. I am using the WebBrowser control and working out of VS 2015.
Here is the weird part. I am adding a form, with a browser control in it, to a COM object such that this thing can be used from C++. When I try to run my test harness app from within the IDE, I get a bunch of javascript errors from the control, and the page doesn't load correctly.
I have tried suppressing the script errors. No go. I have tried the hack where you set the IE emulation mode. No go.
BUT... when I run the very same executable from the command line, it runs and loads the page just fine. I checked the browser ActiveX version of IE being used, and it appears to be the most current version of IE that is on my Windows 10 system ( v11 I think ).
So what is going on here? I am thinking it is some kind of content blocking that IE is doing only when I run in debug mode, but not from the command line. I really need to get this working, because their script sends some Json back to me via the ObjectForScripting property on the web control, and that doesn't appear to be working, thus I need to be able to debug from within the environment.
Ideas?
I'm your humble student.
TIA,
Grego
|
|
|
|
|
Try disabling the Visual Studio Hosting Process: How to: Disable the Hosting Process[^]
When it's turned on, the registry hack probably won't apply, since the process name doesn't match.
Alternatively, try using CefSharp[^], which is an embedded version of Chrome, and doesn't suffer from any of the IE-legacy that comes with the WebBrowser control.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Richard, thanks for the link to CefSharp!
/ravi
|
|
|
|
|
Hi guys, I am very new to programming and I took up an online course on C# to learn on my own free time.
Apologies if I posted in the wrong forum.
I was just introduced to Math Operators and I have this question:
int x = 10;
int y = x++;
Console.WriteLine(x);
Console.WrtieLine(y);
I start without debugging and get this result:
11
10
I understand why y = 10 as (x++) is the value of x before increment. However, why is x = 11?
If I wanted x = 11, shouldn't it be:
int x = 10;
x = ++x;
I am confused because in the first example I only typed "int x = 10;" so shouldn't the value of x be 10 instead of 11?
I am using Visual Studio too.
Appreciate the help!
|
|
|
|
|
x++ is incrementing x and so x becomes 11.
The line
int y = x++; is the same as
int y = x;
x = x + 1;
x++ is just a short form of x = x + 1 with the special treatment of the postfix operation.
Compare with the prefix increment
int y = ++x; which corresponds to
x = x + 1;
int y = x;
|
|
|
|
|
The increment and decrement operators are unary types and increment or decrement their associated variable, so you can just write:
int x = 10;
++x;
int x = 10;
x++;
For a detailed description of all the operators, see Operators (C# Programming Guide)[^]
|
|
|
|
|
No, in that position, the ++ is a Postfix operator. In other words, it acts to increment x after the operation (in this case, assigning x to y). Effectively, this is the same as this:
int y = x; x += 1 If we break this down into the corresponding IL, we can see what's going on. First, the version I just showed broken down:
.entrypoint
.maxstack 2
.locals init (
[0] int32 x,
[1] int32 y)
L_0000: nop
L_0001: ldc.i4.s 10
L_0003: stloc.0
L_0004: ldloc.0
L_0005: stloc.1
L_0006: ldloc.0
L_0007: ldc.i4.1
L_0008: add
L_0009: stloc.0
L_000a: ret
Then, the version of int y = x++;
.entrypoint
.maxstack 3
.locals init (
[0] int32 x,
[1] int32 y)
L_0000: nop
L_0001: ldc.i4.s 10
L_0003: stloc.0
L_0004: ldloc.0
L_0005: dup
L_0006: ldc.i4.1
L_0007: add
L_0008: stloc.0
L_0009: stloc.1
L_000a: ret
As you can see, the two methods produce almost identical IL.
This space for rent
|
|
|
|
|
x is 11 because you're writing to the console AFTER x was incremented. You would see x = 10 if you had coded as follows:
int x = 10;
Console.WriteLine(x);
int y = x++;
Console.WriteLine(x);
etc.
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
As you can tell from the responses the line:
int y = x++;
is pretty confusing. I would try to avoid such prefix/postfix with assignements except for constructs like for loops or while loops.
for(int x = 0; x < somelength; x++){
}
int x = 0;
while(x < somelength){
x++;
}
hope this helps.
|
|
|
|
|
|
Just to add to the other responses, try to keep pre- and post-fix autoincrement and autodecrement operations to simple code:
for (int i = 0; i < 10; i++)
do
{
Console.WriteLine(myArray[i]);
...
} while (myArray[i++] > 0) They are easy to understand, and every developer with more than a few weeks experience should be able to understand that at a glance.
Don't get "creative" with it:
x = (x++ + --x); Is confusing and not at all obvious what the result will be. In C# it's defined by the language specification (but still hard to read) - in similar looking languages like C and C++ it isn't, and different compilers will produce different results (heck, even different versions of the same compiler or different optimisation options can produce different results!)
Keep it simple, and it's a powerful tool which makes code more compact and easier to read: Compilcate it, and things get confusing very quickly!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Management;
using System.Reflection;
using System.Threading;
using System.Configuration;
using System.Net;
using System.Net.NetworkInformation;
namespace RemoteBlocker
{
public partial class Form2 : Form
{
BackgroundWorker bgw = new BackgroundWorker();
int mode = 0;
public Form2()
{
InitializeComponent();
}
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
int total = 100;
for (int i = 0; i <= total; i++)
{
System.Threading.Thread.Sleep(50);
int percents = (i * 100) / total;
bgw.ReportProgress(percents, i);
}
}
private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Visible = false;
if (mode == 1)
{
MessageBox.Show("Enable Successfully.");
}
else if (mode == 2)
{
MessageBox.Show("Disable Successfully.");
}
}
private void btnDisable_Click(object sender, EventArgs e)
{
try
{
Ping pingServer1 = new Ping();
PingReply pingresultFrmServer1 = pingServer1.Send("172.16.102.4");
if (pingresultFrmServer1.Status.ToString() == "Success")
{
try
{
Process proc = null;
string batDir = System.Configuration.ConfigurationManager.AppSettings["block1"];
string executebatDir = System.Configuration.ConfigurationManager.AppSettings["executeblock"];
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(batDir);
ftpRequest.Credentials = new NetworkCredential("subhankar", "subhankar");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
using (WebClient ftpClient = new WebClient())
{
ftpClient.Credentials = new System.Net.NetworkCredential("subhankar", "subhankar");
for (int i = 0; i <= directories.Count - 1; i++)
{
if (directories[i].Contains("."))
{
string path = batDir + directories[i].ToString();
string trnsfrpth = executebatDir + directories[i].ToString();
ftpClient.DownloadFile(path, trnsfrpth);
}
}
proc = new Process();
string trnsfrexepth = executebatDir;
proc.StartInfo.WorkingDirectory = trnsfrexepth;
proc.StartInfo.FileName = "Hostblock.bat";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
proc.StartInfo.Verb = "runas";
proc.Start();
proc.WaitForExit();
DirectoryInfo dir = new DirectoryInfo(trnsfrexepth);
foreach (FileInfo files in dir.GetFiles("*.bat"))
{
files.Delete();
}
foreach (DirectoryInfo dirs in dir.GetDirectories())
{
}
progressBar1.Visible = true;
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
bgw.WorkerReportsProgress = true;
bgw.RunWorkerAsync();
mode = 1;
}
}
catch (Exception exc)
{
}
finally
{
}
}
else
{
Ping pingServer2 = new Ping();
PingReply pingresultFrmServer2 = pingServer2.Send("172.16.102.4");
if (pingresultFrmServer2.Status.ToString() == "Success")
{
try
{
Process proc = null;
string batDir = System.Configuration.ConfigurationManager.AppSettings["block2"];
string executebatDir = System.Configuration.ConfigurationManager.AppSettings["executeblock"];
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(batDir);
ftpRequest.Credentials = new NetworkCredential("subhankar", "subhankar");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
using (WebClient ftpClient = new WebClient())
{
ftpClient.Credentials = new System.Net.NetworkCredential("subhankar", "subhankar");
for (int i = 0; i <= directories.Count - 1; i++)
{
if (directories[i].Contains("."))
{
string path = batDir + directories[i].ToString();
string trnsfrpth = executebatDir + directories[i].ToString();
ftpClient.DownloadFile(path, trnsfrpth);
}
}
proc = new Process();
string trnsfrexepth = executebatDir;
proc.StartInfo.WorkingDirectory = trnsfrexepth;
proc.StartInfo.FileName = "Hostblock.bat";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
proc.StartInfo.Verb = "runas";
proc.Start();
proc.WaitForExit();
DirectoryInfo dir = new DirectoryInfo(trnsfrexepth);
foreach (FileInfo files in dir.GetFiles("*.bat"))
{
files.Delete();
}
foreach (DirectoryInfo dirs in dir.GetDirectories())
{
}
progressBar1.Visible = true;
bgw.RunWorkerAsync();
mode = 1;
}
}
catch (Exception exc)
{
}
finally
{
}
}
else
{
Ping pingServer3 = new Ping();
PingReply pingresultFrmServer3 = pingServer3.Send("172.16.102.4");
if (pingresultFrmServer3.Status.ToString() == "Success")
{
try
{
Process proc = null;
string batDir = System.Configuration.ConfigurationManager.AppSettings["block3"];
string executebatDir = System.Configuration.ConfigurationManager.AppSettings["executeblock"];
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(batDir);
ftpRequest.Credentials = new NetworkCredential("subhankar", "subhankar");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
using (WebClient ftpClient = new WebClient())
{
ftpClient.Credentials = new System.Net.NetworkCredential("subhankar", "subhankar");
for (int i = 0; i <= directories.Count - 1; i++)
{
if (directories[i].Contains("."))
{
string path = batDir + directories[i].ToString();
string trnsfrpth = executebatDir + directories[i].ToString();
ftpClient.DownloadFile(path, trnsfrpth);
}
}
proc = new Process();
string trnsfrexepth = executebatDir;
proc.StartInfo.WorkingDirectory = trnsfrexepth;
proc.StartInfo.FileName = "Hostblock.bat";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
proc.StartInfo.Verb = "runas";
proc.Start();
proc.WaitForExit();
DirectoryInfo dir = new DirectoryInfo(trnsfrexepth);
foreach (FileInfo files in dir.GetFiles("*.bat"))
{
files.Delete();
}
foreach (DirectoryInfo dirs in dir.GetDirectories())
{
}
progressBar1.Visible = true;
bgw.RunWorkerAsync();
mode = 1;
}
}
catch (Exception exc)
{
}
finally
{
}
}
}
}
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private void btnEnable_Click(object sender, EventArgs e)
{
try
{
Ping pingServer1 = new Ping();
PingReply pingresultFrmServer1 = pingServer1.Send("172.16.102.4");
if (pingresultFrmServer1.Status.ToString() == "Success")
{
try
{
Process proc = null;
string batDir = System.Configuration.ConfigurationManager.AppSettings["unblock1"];
string executebatDir = System.Configuration.ConfigurationManager.AppSettings["executeunblock"];
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(batDir);
ftpRequest.Credentials = new NetworkCredential("subhankar", "subhankar");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
using (WebClient ftpClient = new WebClient())
{
ftpClient.Credentials = new System.Net.NetworkCredential("subhankar", "subhankar");
for (int i = 0; i <= directories.Count - 1; i++)
{
if (directories[i].Contains("."))
{
string path = batDir + directories[i].ToString();
string trnsfrpth = executebatDir + directories[i].ToString();
ftpClient.DownloadFile(path, trnsfrpth);
}
}
proc = new Process();
string trnsfrexepth = executebatDir;
proc.StartInfo.WorkingDirectory = trnsfrexepth;
proc.StartInfo.FileName = "Undohostblock.bat";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
proc.StartInfo.Verb = "runas";
proc.Start();
proc.WaitForExit();
DirectoryInfo dir = new DirectoryInfo(trnsfrexepth);
foreach (FileInfo files in dir.GetFiles("*.bat"))
{
files.Delete();
}
foreach (DirectoryInfo dirs in dir.GetDirectories())
{
}
progressBar1.Visible = true;
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
bgw.WorkerReportsProgress = true;
bgw.RunWorkerAsync();
mode = 2;
}
}
catch(Exception exc)
{
}
finally
{
}
}
else
{
Ping pingServer2 = new Ping();
PingReply pingresultFrmServer2 = pingServer2.Send("172.16.102.4");
if (pingresultFrmServer2.Status.ToString() == "Success")
{
try
{
Process proc = null;
string batDir = System.Configuration.ConfigurationManager.AppSettings["unblock2"];
string executebatDir = System.Configuration.ConfigurationManager.AppSettings["executeunblock"];
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(batDir);
ftpRequest.Credentials = new NetworkCredential("subhankar", "subhankar");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
using (WebClient ftpClient = new WebClient())
{
ftpClient.Credentials = new System.Net.NetworkCredential("subhankar", "subhankar");
for (int i = 0; i <= directories.Count - 1; i++)
{
if (directories[i].Contains("."))
{
string path = batDir + directories[i].ToString();
string trnsfrpth = executebatDir + directories[i].ToString();
ftpClient.DownloadFile(path, trnsfrpth);
}
}
proc = new Process();
string trnsfrexepth = executebatDir;
proc.StartInfo.WorkingDirectory = trnsfrexepth;
proc.StartInfo.FileName = "Undohostblock.bat";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
proc.StartInfo.Verb = "runas";
proc.Start();
proc.WaitForExit();
DirectoryInfo dir = new DirectoryInfo(trnsfrexepth);
foreach (FileInfo files in dir.GetFiles("*.bat"))
{
files.Delete();
}
foreach (DirectoryInfo dirs in dir.GetDirectories())
{
}
progressBar1.Visible = true;
bgw.RunWorkerAsync();
mode = 2;
}
}
catch (Exception exc)
{
}
finally
{
}
}
else
{
Ping pingServer3 = new Ping();
PingReply pingresultFrmServer3 = pingServer3.Send("172.16.102.4");
if (pingresultFrmServer3.Status.ToString() == "Success")
{
try
{
Process proc = null;
string batDir = System.Configuration.ConfigurationManager.AppSettings["unblock3"];
string executebatDir = System.Configuration.ConfigurationManager.AppSettings["executeunblock"];
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(batDir);
ftpRequest.Credentials = new NetworkCredential("subhankar", "subhankar");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
using (WebClient ftpClient = new WebClient())
{
ftpClient.Credentials = new System.Net.NetworkCredential("subhankar", "subhankar");
for (int i = 0; i <= directories.Count - 1; i++)
{
if (directories[i].Contains("."))
{
string path = batDir + directories[i].ToString();
string trnsfrpth = executebatDir + directories[i].ToString();
ftpClient.DownloadFile(path, trnsfrpth);
}
}
proc = new Process();
string trnsfrexepth = executebatDir;
proc.StartInfo.WorkingDirectory = trnsfrexepth;
proc.StartInfo.FileName = "Undohostblock.bat";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
proc.StartInfo.Verb = "runas";
proc.Start();
proc.WaitForExit();
DirectoryInfo dir = new DirectoryInfo(trnsfrexepth);
foreach (FileInfo files in dir.GetFiles("*.bat"))
{
files.Delete();
}
foreach (DirectoryInfo dirs in dir.GetDirectories())
{
}
progressBar1.Visible = true;
bgw.RunWorkerAsync();
mode = 2;
}
}
catch (Exception exc)
{
}
finally
{
}
}
else
{
}
}
}
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private void btnClose_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
this.Hide();
f.Close();
}
private void btnAdmin_Click(object sender, EventArgs e)
{
Form3 f = new Form3();
this.Hide();
f.Show();
}
}
}
after clicking enable button when clicking disable button then message box comes 2 times.it is increasing recursively.
|
|
|
|
|
Please edit your question and remove all the code not relevant to the problem, and show exactly where the problem occurs.
|
|
|
|
|
Yeah, nobody is going to dig through all that code. Reduce it down to just the necessary parts and someone might take a look at it.
|
|
|
|
|
More paragraphs! (i.e. "Methods").
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Hi,
you seem to create one BackgroundWorker and reuse it over and over. Be aware that each time you execute a line such as
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
you ADD a handler to the event, so the second time the event fires, it will execute the same handler twice.
As this also applies to your line
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
I expect your BGW will duplicate its work and the number of results will behave quadratically.
There are several remedies:
1) you could remove the handlers with similar lines, say
bgw.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
2) you could create a new BackgroundWorker each time;
3) but why not stuff all the work inside the bgw_DoWork method, and run the BackgroundWorker only once?
modified 24-Mar-17 10:37am.
|
|
|
|
|
|
I am creating a Xamarin app and I have to populate master data into sqlite DB on mobile.
I am new to OOPS and Xamarin
I have multiple requests to be made to get data from WebApi. The request I need to make is more than 50 calls to get info.
Now, I need to write async generic code to achieve this.
For example: I have to populate data for EmployeeMaster, Company Master etc..
My generic code should be able to identify which URL to call and Which object has to be returned. My normal code is as follows below
The only varying data are RestUrl and TodoItem
public async Task<list<todoitem>> RefreshDataAsync ()
{
Items = new List<todoitem> ();
RestUrl = "http://localhost:9054/TotoItem"
var uri = new Uri (string.Format (RestUrl, string.Empty));
try {
var response = await client.GetAsync (uri);
if (response.IsSuccessStatusCode) {
var content = await response.Content.ReadAsStringAsync ();
Items = JsonConvert.DeserializeObject <list<todoitem>> (content);
}
} catch (Exception ex) {
Debug.WriteLine (@" ERROR {0}", ex.Message);
}
return Items;
}
|
|
|
|
|
Well, you're returning List<todoitem>, which is different from Task<list<todoitem>>.
It's also worth noting that your method, as written, will run synchronously despite your *Async() naming.
Convert the return type to List<todoitem> and rename your function and see what happens.
You likely also want to define variables in the method scope for Items and RestUrl. You also appear to have a typo in a string constant. Check the RestUrl variable.
"There are three kinds of lies: lies, damned lies and statistics."
- Benjamin Disraeli
|
|
|
|
|
Thank you Benjamin,
Even making the change will create a strong bond with todoitem. My intention is to make it generalised so that I can make a single method for making calls for different URL's and get data for different class object
As I have stated earlier I don't want to write the same code for a different URL request.
|
|
|
|
|
I tackled an issue similar to this a couple of years ago when I wrote, first this[^] article and then it's follow up here[^]. The architecture is a little bit convoluted so please take the time to read it and the code in the project files carefully.
This space for rent
|
|
|
|
|
Not a Benjamin, that's a quote.
You need to tack down the real basic fundamentals first; generics in C# are first class members and almost trivial.
But if you'd rather walk before crawling:
public async T RefreshData<T>(string url)
{
try
{
var response = await client.GetAsync (url);
if (response.IsSuccessStatusCode) {
var content = await response.Content.ReadAsStringAsync ();
var items = JsonConvert.DeserializeObject<T>(content);
if(items != null)
{
return items;
}
throw new Exception($"Service did not provide a response formatted as type: {typeof(T)}");
}else{
throw new Exception($"Service request failure. Code: {response.StatusCode}");
}
}
catch (Exception ex)
{
Debug.WriteLine ($"ERROR {ex.Message}");
}
}
The $"" is the newfangled string interpolation BTW. Call with:
var myList = RefreshData<List<todoitem>>("http ://localhost:9054/TotoItem");
I had to throw an extra space in the string as the C# preformat is throwing in an anchor tag.
"There are three kinds of lies: lies, damned lies and statistics."
- Benjamin Disraeli
|
|
|
|
|
Nathan Minier wrote: you're returning List<todoitem>, which is different from Task<List<todoitem>>. It's an async method, so that's perfectly normal.
Nathan Minier wrote: your method, as written, will run synchronously Nope:
var response = await client.GetAsync (uri);
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thanks a lot Nathan Minier and Richard Deeming for the solution.
I will try to implement same solution and check
|
|
|
|
|
I'm sorry Richard, that's not correct.
Using the async keyword can mean that you want to return a Task that is not yet resolved, but doesn't necessarily mean that. It can simply mean that you're coalescing an asynchronous operation into a synchronous context, which is precisely what "await" does.
Using the await keyword means that you want to use the value provided by Task.Result, not the Task itself. It blocks execution of the method (ie runs synchronously) until the awaited Task is completed. That means that while the method is flagged as async, it resolves async operations into a synchronous context. I understand that the terminology is a bit misleading and the documentation does not help. But the fact is that if you're blocking the thread, you are running synchronously.
If the method were run asynchronously, it would look more like this:
public async Task<T> RefreshData<T>(string url)
{
return Task<T>.Run(()=>
{
var response = await client.GetAsync (url);
if (response.IsSuccessStatusCode) {
var content = await response.Content.ReadAsStringAsync ();
var items = JsonConvert.DeserializeObject<T>(content);
if(items != null)
{
return items;
}
throw new Exception($"Service did not provide a response formatted as type: {typeof(T)}");
}else{
throw new Exception($"Service request failure. Code: {response.StatusCode}");
}
})
.ContinueWith(ex => { Debug.WriteLine ($"ERROR {ex.Message}");}, TaskContinuationOptions.OnlyOnFaulted));
}
I just didn't want to confuse the poor guy with Task execution and moving between synchronous and asynchronous contexts when he doesn't even have generics down.
"There are three kinds of lies: lies, damned lies and statistics."
- Benjamin Disraeli
|
|
|
|
|