我正在使用我为“测试”而编写的该库,尤其是为了了解静态变量在本机环境中的工作方式。我不是C#经验丰富的人,我的问题可能只是显而易见的(我希望不是...)。
所以,我主要用C语言编写了一个包装器,目的是加载共享库并调用特定的方法。 C#代码定义了一个静态SortedList,该列表在从C程序到C#库的多次调用中得到更新(我正在使用corert进行编译)。如您所见,C#库从创建的任务中更新静态变量。
例如,在此处明确指出“多次调用相同的dll”将重置所有静态变量。
Is a static variable in a library (DLL) shared by all processes referencing that library?
也许我弄错了,但我真的不明白为什么在我的情况下,静态变量只停留在那儿,即使我多次调用同一个库也没有重新初始化它的内容。
def custom_lemmatizer(df,input_col,output_col) -> DataFrame:
"""
Lemmatizes the df's using input_column and returns
a df with lemmatized words as output_column
"""
input_col = udf(lambda x: " ".join(x))(df[input_col])
def spacy_lemma(input_col)->list:
nlp = spacy.load('en',disable=['parser','ner'])
doc = nlp(input_col)
return [token.lemma_ for token in doc]
spacy_udf = udf(lambda string: spacy_lemma(string),ArrayType(StringType()))
return df.withColumn(output_col,spacy_udf(input_col))
namespace AsyncTicker
{
class asyncTicker
{
public static SortedList< int,string > TryDict = new SortedList<int,string>();
[NativeCallable(EntryPoint = "RVExtension",CallingConvention = CallingConvention.StdCall)]
public static void RVExtension()
{
string conteggio = Convert.ToString(TryDict.Count);
if (TryDict.Count > 0) {
conteggio += " || Value of last element is:" + TryDict.Values[TryDict.Count - 1];
}
Executetask();
Console.WriteLine(conteggio);
}
public static void Executetask()
{
Task t1 = Task.Factory.StartNew(() =>
{
Random tmp = new Random();
int val = tmp.Next(100);
TryDict.Add(val,String.Format("test{0}",val));
});
}
}
}
如您所见,我还尝试多次加载该库,以查看TryDict变量是否将被重置...并且只要我保持C'invoker'运行,它的值就一直保持在那里。在提到的问题中,明确指出,在库的每次调用中都会创建一个AppDomain,然后将其销毁...所以为什么不是这种情况?
谢谢大家。我只想得到一个解释,以便更好地理解为什么这样做。
p.s:很抱歉提供了如此多的代码行
这是输出