- Home /
Unable to work effectively in an event handler (ToString can only be called from the main thread.)
I am receiving messages from websocket-sharp in an event handler and trying to do a tiny bit of work in the handler (check if correct answer and if so add score.)
Whenever I reach the currentQuestionVotes[resp.selected]++;
line, the function ceases executing and unity spits out a
ToString can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
UnityEngine.Object:ToString()
resp.identifier is a string
, resp.selected is a string
, questionAnsweredState is a Dictionary<string,Dictionary<int,bool>>
, and currentQuestionVotes is a Dictionary<string,int>
onMessage = (sender, msg) => {
try {
Message_TriviaResponse resp = JsonConvert.DeserializeObject<Message_TriviaResponse>(msg.Data);
if (timer > 0) {
//ensure player has not answered question already
if (questionAnsweredState.ContainsKey(resp.identifier)) {
if (questionAnsweredState[resp.identifier].ContainsKey(currentQuestion)) {
if (questionAnsweredState[resp.identifier][currentQuestion]) return;
}
} else {
questionAnsweredState[resp.identifier] = new Dictionary<int, bool>();
}
//and if they havent, count their vote
questionAnsweredState[resp.identifier][currentQuestion] = true;
//Debug.Log("Player "+GameManager.players[resp.identifier].name +" selected answer "+resp.selected);
currentQuestionVotes[resp.selected]++;
if (resp.selected.Equals(selectedQuestions[currentQuestion].correct_answer)) { //award points for correct answer
GameManager.players[resp.identifier].score += Mathf.FloorToInt(1000 * (timer / GameManager.triviaQuestionTime));
Debug.Log("correct answer");
}
print("test");
}
} catch { }
};
I do not understand why ToString is even being called on the currentQuestionVotes line, there is no conversion to be done. And even so, why is ToString threadlocked? You would think the actual object that overrides ToString would be initialized prior to returning from ToString.
Thanks.
Your answer
![](https://koobas.hobune.stream/wayback/20220612140348im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
How do you stop multithreading in editor? 1 Answer
Android plugins and callbacks on non-scripting threads 1 Answer
Unity Asynchronous Socket Client - Threading Problem 2 Answers
Math behind Transform.TransformPoint? 1 Answer
How can I get a component data from an entity inside a JobComponentSystem? 1 Answer