is there any implement of CallContext.GetData / SetData in .NET Core?
AsyncLocal<>
in .NET Core like CallContext.LogicGetData
/LogicSetData
. How about GetData
and SetData
?Thread.GetData/SetData
, ThreadStatic
, ThreadLocal
all of these has same problem, when Thread
finish, these value will not clean, and if these Thread
reuse(or maybe Thread Id
reuse), the LocalValue is already exists.
class Program
{
[ThreadStatic]
private static string Static;
private static ThreadLocal<string> Local = new ThreadLocal<string>(false);
private static LocalDataStoreSlot Slot = Thread.AllocateDataSlot();
static void Main(string args)
{
var threadIds = new List<int>();
for (var i = 0; i < 100; i++)
{
Task.Run(() =>
{
if (threadIds.Contains(Thread.CurrentThread.ManagedThreadId))
{
if(Static == null || Local.Value == null || Thread.GetData(Slot) == null)
{
// never get in
}
else
{
// same thread id always already exists value
}
}
else
{
threadIds.Add(Thread.CurrentThread.ManagedThreadId);
if (Static == null && Local.Value == null && Thread.GetData(Slot) == null)
{
var threadId = Thread.CurrentThread.ManagedThreadId.ToString();
Static = threadId;
Local.Value = threadId;
Thread.SetData(Slot, threadId);
}
else
{
//never get in
}
}
}).Wait();
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
I know how CallContext
do, it just copy LogicalCallContext
values to child thread and do not copy IllogicalCallContext
. But .NET Core only IAsyncLocalValueMap
in ExecutionContext
, and it always copy to child thread(except SuppressFlow). So, is there any implement of GetData
/SetData
? or any way to clean ThreadLocal
when its finished.
c# .net multithreading .net-core
add a comment |
AsyncLocal<>
in .NET Core like CallContext.LogicGetData
/LogicSetData
. How about GetData
and SetData
?Thread.GetData/SetData
, ThreadStatic
, ThreadLocal
all of these has same problem, when Thread
finish, these value will not clean, and if these Thread
reuse(or maybe Thread Id
reuse), the LocalValue is already exists.
class Program
{
[ThreadStatic]
private static string Static;
private static ThreadLocal<string> Local = new ThreadLocal<string>(false);
private static LocalDataStoreSlot Slot = Thread.AllocateDataSlot();
static void Main(string args)
{
var threadIds = new List<int>();
for (var i = 0; i < 100; i++)
{
Task.Run(() =>
{
if (threadIds.Contains(Thread.CurrentThread.ManagedThreadId))
{
if(Static == null || Local.Value == null || Thread.GetData(Slot) == null)
{
// never get in
}
else
{
// same thread id always already exists value
}
}
else
{
threadIds.Add(Thread.CurrentThread.ManagedThreadId);
if (Static == null && Local.Value == null && Thread.GetData(Slot) == null)
{
var threadId = Thread.CurrentThread.ManagedThreadId.ToString();
Static = threadId;
Local.Value = threadId;
Thread.SetData(Slot, threadId);
}
else
{
//never get in
}
}
}).Wait();
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
I know how CallContext
do, it just copy LogicalCallContext
values to child thread and do not copy IllogicalCallContext
. But .NET Core only IAsyncLocalValueMap
in ExecutionContext
, and it always copy to child thread(except SuppressFlow). So, is there any implement of GetData
/SetData
? or any way to clean ThreadLocal
when its finished.
c# .net multithreading .net-core
add a comment |
AsyncLocal<>
in .NET Core like CallContext.LogicGetData
/LogicSetData
. How about GetData
and SetData
?Thread.GetData/SetData
, ThreadStatic
, ThreadLocal
all of these has same problem, when Thread
finish, these value will not clean, and if these Thread
reuse(or maybe Thread Id
reuse), the LocalValue is already exists.
class Program
{
[ThreadStatic]
private static string Static;
private static ThreadLocal<string> Local = new ThreadLocal<string>(false);
private static LocalDataStoreSlot Slot = Thread.AllocateDataSlot();
static void Main(string args)
{
var threadIds = new List<int>();
for (var i = 0; i < 100; i++)
{
Task.Run(() =>
{
if (threadIds.Contains(Thread.CurrentThread.ManagedThreadId))
{
if(Static == null || Local.Value == null || Thread.GetData(Slot) == null)
{
// never get in
}
else
{
// same thread id always already exists value
}
}
else
{
threadIds.Add(Thread.CurrentThread.ManagedThreadId);
if (Static == null && Local.Value == null && Thread.GetData(Slot) == null)
{
var threadId = Thread.CurrentThread.ManagedThreadId.ToString();
Static = threadId;
Local.Value = threadId;
Thread.SetData(Slot, threadId);
}
else
{
//never get in
}
}
}).Wait();
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
I know how CallContext
do, it just copy LogicalCallContext
values to child thread and do not copy IllogicalCallContext
. But .NET Core only IAsyncLocalValueMap
in ExecutionContext
, and it always copy to child thread(except SuppressFlow). So, is there any implement of GetData
/SetData
? or any way to clean ThreadLocal
when its finished.
c# .net multithreading .net-core
AsyncLocal<>
in .NET Core like CallContext.LogicGetData
/LogicSetData
. How about GetData
and SetData
?Thread.GetData/SetData
, ThreadStatic
, ThreadLocal
all of these has same problem, when Thread
finish, these value will not clean, and if these Thread
reuse(or maybe Thread Id
reuse), the LocalValue is already exists.
class Program
{
[ThreadStatic]
private static string Static;
private static ThreadLocal<string> Local = new ThreadLocal<string>(false);
private static LocalDataStoreSlot Slot = Thread.AllocateDataSlot();
static void Main(string args)
{
var threadIds = new List<int>();
for (var i = 0; i < 100; i++)
{
Task.Run(() =>
{
if (threadIds.Contains(Thread.CurrentThread.ManagedThreadId))
{
if(Static == null || Local.Value == null || Thread.GetData(Slot) == null)
{
// never get in
}
else
{
// same thread id always already exists value
}
}
else
{
threadIds.Add(Thread.CurrentThread.ManagedThreadId);
if (Static == null && Local.Value == null && Thread.GetData(Slot) == null)
{
var threadId = Thread.CurrentThread.ManagedThreadId.ToString();
Static = threadId;
Local.Value = threadId;
Thread.SetData(Slot, threadId);
}
else
{
//never get in
}
}
}).Wait();
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
I know how CallContext
do, it just copy LogicalCallContext
values to child thread and do not copy IllogicalCallContext
. But .NET Core only IAsyncLocalValueMap
in ExecutionContext
, and it always copy to child thread(except SuppressFlow). So, is there any implement of GetData
/SetData
? or any way to clean ThreadLocal
when its finished.
c# .net multithreading .net-core
c# .net multithreading .net-core
asked Nov 21 '18 at 7:14
Hourglass
325
325
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Use a change handler for the AsyncLocal to clear the value when the thread changes?
private static AsyncLocal<string> AsyncLocal
= new AsyncLocal<string>(ThreadContextChanged);
private static void ThreadContextChanged(AsyncLocalValueChangedArgs<string> changedArgs)
{
if (changedArgs.ThreadContextChanged &&
changedArgs.CurrentValue != null)
{
AsyncLocal.Value = null;
}
}
thank you so much, its useful. I have seen this parameter before, but the name let me feel its only trigger when value changed.
– Hourglass
Nov 23 '18 at 7:26
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53406968%2fis-there-any-implement-of-callcontext-getdata-setdata-in-net-core%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Use a change handler for the AsyncLocal to clear the value when the thread changes?
private static AsyncLocal<string> AsyncLocal
= new AsyncLocal<string>(ThreadContextChanged);
private static void ThreadContextChanged(AsyncLocalValueChangedArgs<string> changedArgs)
{
if (changedArgs.ThreadContextChanged &&
changedArgs.CurrentValue != null)
{
AsyncLocal.Value = null;
}
}
thank you so much, its useful. I have seen this parameter before, but the name let me feel its only trigger when value changed.
– Hourglass
Nov 23 '18 at 7:26
add a comment |
Use a change handler for the AsyncLocal to clear the value when the thread changes?
private static AsyncLocal<string> AsyncLocal
= new AsyncLocal<string>(ThreadContextChanged);
private static void ThreadContextChanged(AsyncLocalValueChangedArgs<string> changedArgs)
{
if (changedArgs.ThreadContextChanged &&
changedArgs.CurrentValue != null)
{
AsyncLocal.Value = null;
}
}
thank you so much, its useful. I have seen this parameter before, but the name let me feel its only trigger when value changed.
– Hourglass
Nov 23 '18 at 7:26
add a comment |
Use a change handler for the AsyncLocal to clear the value when the thread changes?
private static AsyncLocal<string> AsyncLocal
= new AsyncLocal<string>(ThreadContextChanged);
private static void ThreadContextChanged(AsyncLocalValueChangedArgs<string> changedArgs)
{
if (changedArgs.ThreadContextChanged &&
changedArgs.CurrentValue != null)
{
AsyncLocal.Value = null;
}
}
Use a change handler for the AsyncLocal to clear the value when the thread changes?
private static AsyncLocal<string> AsyncLocal
= new AsyncLocal<string>(ThreadContextChanged);
private static void ThreadContextChanged(AsyncLocalValueChangedArgs<string> changedArgs)
{
if (changedArgs.ThreadContextChanged &&
changedArgs.CurrentValue != null)
{
AsyncLocal.Value = null;
}
}
answered Nov 23 '18 at 5:58
Ben Adams
2,2101720
2,2101720
thank you so much, its useful. I have seen this parameter before, but the name let me feel its only trigger when value changed.
– Hourglass
Nov 23 '18 at 7:26
add a comment |
thank you so much, its useful. I have seen this parameter before, but the name let me feel its only trigger when value changed.
– Hourglass
Nov 23 '18 at 7:26
thank you so much, its useful. I have seen this parameter before, but the name let me feel its only trigger when value changed.
– Hourglass
Nov 23 '18 at 7:26
thank you so much, its useful. I have seen this parameter before, but the name let me feel its only trigger when value changed.
– Hourglass
Nov 23 '18 at 7:26
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53406968%2fis-there-any-implement-of-callcontext-getdata-setdata-in-net-core%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown