У меня есть следующий метод, который возвращал значение null, пытаясь отладить его. Я обнаружил, что при достижении последней строки (возврата) возвращаемая переменная имеет ожидаемое значение, но вместо выхода из метода и возврата значениякод возвращается к предыдущему улову с «NullReferenceException» и в итоге возвращает ноль после этого.Это происходит только тогда, когда метод вызывается в нескольких потоках одновременно.
Может кто-нибудь объяснить мне, почему это происходит?
вызывающий блок:
List<Thread> threads = new List<Thread>();
foreach (Event eV in temp)
{
var associatedUserEvent = new User_Event().GetItemByFilter("Event", eV.Title);
ThreadStart c = new ThreadStart(() => xx(temp2, eV));
Thread cT = new Thread(c);
threads.Add(cT);
cT.Start();
}
foreach (var cT in threads)
{
cT.Join();
}
вызывающий метод:
public void xx(List<User_Event> temp2, Event eV)
{
var associatedUserEvent = new User_Event().GetItemByFilter("Event", eV.Title);
if (associatedUserEvent != null) temp2.Add(associatedUserEvent);
}
метод, который выполняется в обратном направлении: (строки a, c и t предназначены только для отладки)
public SPListItemCollection executeQuery()
{
SPListItemCollection toReturn = null;
string a, t, c;
try
{
SPWeb web = SPContext.Current.Web;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
if (type.getListName() != null)
{
SPList list = web.GetList(web.ServerRelativeUrl + "/Lists/" + type.getListName());
if (filters != null || folderPath != null)
{
SPQuery query = new SPQuery();
if (customViewFields != null)
{
query.ViewFields = buildViewFields();
query.ViewFieldsOnly = true;
query.IncludeMandatoryColumns = false;
}
query.IncludeAttachmentUrls = true;
query.Folder = web.GetFolder(web.ServerRelativeUrl + "/Lists/" + type.getListName() + "/" + folderPath);
query.Query = this.filters != null && this.filters.Length > 0 ? this.CreateCAMLQuery() : @"<Query><OrderBy><FieldRef Name='ID' /></OrderBy></Query>";
query.ViewAttributes = "Scope=\"Recursive\"";
toReturn = list.GetItems(query);
a = "";
}
else
{
toReturn = list.GetItems(customViewFields);
}
c = "";
}
else
{
throw new System.ArgumentException("Custom attributte listname cannot be null");
}
t = "";
});
}
catch (Exception exception)
{
a = "";
}
return toReturn;
}