나는 2-8 배경 작업자가 같은 방법으로 액세스 할 때 문제가 발생합니다. 그래서 여기 일례이다C# 여러 가지 배경 작업자 동일한 방법
int threadnumber = 0;
int retries[] = new int[8];
private XmlDocument GetXML(string ApiUrl, int threadnumber)
{
var mySourceDoc = new XmlDocument();
try
{
var httpRequest = (HttpWebRequest)WebRequest.Create(ApiUrl);
httpRequest.Timeout = 50000;
if (cb_Proxy.Checked == true)
{
WebProxy germanserver = new WebProxy();
Uri newUri = new Uri("http://" + txt_Proxy.Text);
germanserver.Address = newUri;
httpRequest.Proxy = germanserver;
}
var response = (HttpWebResponse)httpRequest.GetResponse();
var receiveStream = response.GetResponseStream();
receiveStream.ReadTimeout = 150000;
mySourceDoc.Load(receiveStream);
receiveStream.Close();
retries[threadnumber-1] = 1;
}
catch (Exception ex)
{
//DialogResult MessBox = MessageBox.Show("Der Server ist nicht erreichbar oder es ist ein anderes Problem mit dem Server aufgetreten. Es wird automatisch 3 mal erneut versucht. Fehlermeldung anzeigen?", "Fehler", MessageBoxButtons.YesNo, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
//if (MessBox == DialogResult.Yes) MessageBox.Show(ex.Message);
retries[threadnumber - 1]++;
consoletext = "Fehler: " + ex.Message + "; Neuer Versuch " + retries[threadnumber - 1] + " von Url " + ApiUrl + Environment.NewLine;
if (threadnumber == 1) workingHelper1.ReportProgress(counterhelper[0]);
if (threadnumber == 2) workingHelper2.ReportProgress(counterhelper[1]);
if (threadnumber == 3) workingHelper3.ReportProgress(counterhelper[2]);
if (threadnumber == 4) workingHelper4.ReportProgress(counterhelper[3]);
if (threadnumber == 5) workingHelper5.ReportProgress(counterhelper[4]);
if (threadnumber == 6) workingHelper6.ReportProgress(counterhelper[5]);
if (threadnumber == 7) workingHelper7.ReportProgress(counterhelper[6]);
if (threadnumber == 8) workingHelper8.ReportProgress(counterhelper[7]);
Thread.Sleep(3000);
}
finally
{
if (retries[threadnumber - 1] > 1 && retries[threadnumber - 1] <= 3) GetXML(ApiUrl, threadnumber);
if (retries[threadnumber - 1] >= 4) retries[threadnumber] = 1;
}
return mySourceDoc;
}
생성 URL 문자열과의 ThreadNumber 1-8와 메소드를 호출은 GetXML backgroundworkers. 내 재시도가 5 이상이되는 경우가 있습니다. 그래서 나는 종종 같은 변수에 액세스하고 그것을 세는 백 선인들이라고 생각합니까?
TPL 대신 또는 이와 유사한 배경 작업자를 사용해야하는 이유가 있습니까? – Petaflop
이것은 좋은 질문입니다. 나는 backgroundworkers로서 또 다른 옵션에 대해 생각 해본 적이 없다. 여러 가지 배경 지식 근로자가 같은 방법으로 변수에 액세스 할 때 threadnumber는 다른 작업자가 런타임에 재정의 할 수 있습니까? –
스레드 간 재귀 호출이 너무 많이 일어나서 거기에서 일어날 수있는 일을 이해하지 못할 가능성이 높습니다. 당신은 당신의 메소드를 다른 메소드의 결과를 위해'async'와'await'으로 만들 수 있습니다. 그리고 나서 당신이 필요로하는만큼 여러 번 호출을 다시 시도하십시오. – Petaflop